Ruby是强类型还是弱类型?
对于javascript来说,可能也是如此。
- 为什么您认为它们是相同的——因为Rails开发人员同时使用Ruby和JavaScript?
- "强类型"和"弱类型"是没有意义的短语
Ruby是"强类型"。
强类型化是指在对对象执行要求某种类型的操作之前检查对象的类型(不是OOP意义上的,而是一般意义上的)。
弱类型意味着不执行任何检查以确保对对象的操作可以成功。(例如,当函数访问类似字符串和浮点数组时,如果不进行类型检查,则允许该操作)
编辑:这个答案发布已经6年了,我认为它需要一些额外的澄清:
多年来,"类型安全是表盘而不是绝对的"这一概念开始被用来支持二进制含义(是/否)。
与大多数典型的动态语言相比,Ruby具有更强的类型(带有"er")。Ruby需要显式语句来进行转换,例如:array("foo"),"42"。对于_i,float(23),Ruby类型的拨号比"弱类型"更接近"强类型"的频谱末端。
所以我会说"Ruby是一种比大多数常用的动态语言更强的类型化动态语言"
- 谢谢你的澄清。地狱页:1给你的
- Static Typing does not imply strong typing.例如,C是静态的类型,因为编译器知道每一个变量的类型,但它不是很强的类型,因为记忆只是记忆,可以通过程序来处理。
- @Justice,I guess you have a point…
- 你可能想知道Javascript是强还是弱。
- @Andrew Grimm,Java is weakly typed,no one prevents you to add a string to an integer and get results or an array of int to string and get an array of chars…或者其他的疯狂组合的确,你不能创造出错误的时间,就像你在C中所能做的那样,但是如果你想把语言进一步分类,Java Script是一种安全的软弱的语言,而C是一种不安全的软弱的语言。在我的记忆里,你只会产生坏的结果,而在我的记忆里,你会崩溃。
- 对不起,打扰了一次老的讨论,但是在涉及任何手术之前,有没有任何检查?当你像ABC+〔1,2,3〕这样写入代码时,它只是一个数学问题,在这个问题上,最严格的方法可以处理一个阵列实例。
- "爪哇是一种薄弱的类型,没有人能防止你加入一条弦以实现整合和结果":这不是很薄弱的类型,而是多态性。操作方法和调度是以操作类型为基础的。这不同于用一条比特弦表示一个阵列的浮点,并将其重新解释为一个结构(如你可以在C和C+)。
- @Giorgio,Javascript is type safe,but still weakly typed,anything is a bool potentially,a阵列,a string,a number,yet you can't corrrupt memory.这也是一种薄弱的类型,但不象Javascript那样安全,因为你可能会因为类型的错误而腐蚀记忆。
- @POPCATALIN:我不知道你的意思是"当一个函数接入一个字符串和一个阵列的浮点"。复制这个网站码到您的网站上以设置一个投票箱在您的网站上。或是"当一个函数接近一条弦或一个阵列的浮点时"?
- 我对强型vs弱型的解释有很多不同的解释,但这是我第一次听到一个视角像"Java是脆弱的,而红宝石是强型的"。我不同意这样的论点,即如果一种语言能表现出1 +"one"的弱点。有些人争辩说,"如果一个物体有其类型的信息(在编译时间或运行时间,在许多不同类型的物体之间)",则该物体的类型会很强。在红宝石上,Python和埃多克斯1〔4〕等的东西是什么?我喜欢这样更好,但它也使很多语言变得更强壮!
- @Nawfal是1+"one":"1one"or 2 or some garbled memory(C/C+++when you force this)?在强化类型语言中,这是一个错误。强有力的典型不只是关于运行时间类型的信息(JS拥有的信息,而是关于使用典型信息作为约束的信息分配或不分配的信息)。Strong Typing=Stronger Type Constraints,Weak Typing=Weaker Type Constraints.典型是一个方程式,你可以在其中找到一些东西。The weakest typed being machine code,while there's no limit of how strong typed a language can be.See scala for example.
- @Popcatalin我不反对你的论点,肯定这是一个定义。我说我为什么不喜欢这个论点。根据语言的各种强化规则在任何情况下取得的结果。实例中有允许+的语言,运算符将过载以产生oneSpecificThing + aDifferentButSpecificThing可能。这不是一个软弱的系统,语言的灵活性。在爪哇,当你做string + int时,需要价值和变量的类型发生变化。
- 你也在反驳什么如果强内斯是一个二进制的,那么像爪哇这样的一般性声明是软型的,而红宝石则是强大的。
- @popcatalin:内存安全不是类型安全-javascript主要是强类型的,很多东西在弱类型的基础上工作(想想自动强制);而且你的答案真的让人困惑,似乎强弱与静态动态在某种程度上是相同的(re"弱类型意味着不进行检查",这是错误的)。-他们不是。实际上,有两种不同的弱类型可以从一开始,一种语言可以有1种或两种,因此至少有12种不同的组合可供语言"选择"。
- 这个答案是基于对弱类型的错误定义。弱类型并不意味着不进行类型检查。这意味着语言试图以静默方式自动将对象转换为另一种类型,以允许执行操作。
- @JPMC26这是强制类型。不管结果是错误还是混乱的结果。如果类型系统不用于强制执行正确的行为,那么该语言是弱类型的(无论它如何执行)。
wikpedia将其标记为"动态(‘duck’)类型"。
关于波普关于它是"强类型"的评论,我不确定他的解释是否与封面下面的内容相符。MRI并不真正"检查"是否可以对一个对象执行操作;它只是将消息发送给该对象,如果该对象不接受该消息(通过方法声明或通过在缺少方法的情况下处理该消息),它就会死机。如果实际检查运行时以确保操作是可能的,那么丢失的方法将无法工作。
另外,应该注意的是,因为Ruby中的所有内容都是一个对象(我的意思是所有内容),所以我不确定他所说的"不从OO意义上讲"是否准确。在Ruby中,您要么是对象,要么是消息。
虽然你可以讨论这些术语的定义,但我想说:
Ruby动态强类型化,而JavaScript动态弱类型化。
imho ruby是强但动态类型的。
我认为这些语言都是鸭式的。
我只是偶然发现了这条旧线,但认为我可以提出我的意见是恰当的。(不,我不是"劫持"僵尸线。)
我对"强类型"一词的口语解释具体地说是"编译时"(这是当今许多语言,包括Ruby,"根本没有的东西")。
例如,一个简单的赋值语句,如a = b;可以由编译器根据它对a和b的"类型"的评估以及程序员提供的类型转换(如果适用)的规定来判断是否可以接受。如果该语句被判定为不可接受,则会抛出编译时错误,并且不会生成"可执行文件"。
当然,这个概念与诸如ruby、php、perl、javascript等语言的基本设计规则,或当今使用非常广泛(并且非常成功)的许多其他语言不兼容。(提醒你,我不是说这是对他们的"判决"。它们就是它们的样子,它们确实把培根带回家了。)
因为这些语言没有"编译时间",我的(!)它们不能被称为"强类型",它们必须在运行时做出决策,而根据它们的设计,这些决策是不可能很快做出的。
(另外,请注意,为了提前捕获更多的错误,我特别排除了针对该语言或该语言出现的各种"lint"工具。这些是非常有用的,是的,但不是同一件事。)
(我也有意排除各种优秀的!!)以各种目标语言生成源代码的工具…出于同样的原因。)
而且——我再说一遍——我正在进行分类,而不是判断。
过度简化的答案是ruby和javascript都是弱类型的。
然而,这个问题并不像看上去那么清晰——请参阅维基百科的这篇文章,更深入地讨论强类型语言和弱类型语言之间的区别。
- 看起来好像被鲁比弗莱比.com/ruby-is-动态-和强-型库鲁瑟和库鲁瑟所矛盾?