30

ruby 是强类型还是弱类型?

Javascript 大概也是如此。

4

7 回答 7

50

Ruby 是“强类型”。

强类型是指在执行需要某种类型的操作之前检查对象的类型(不是 OOP 意义上的,而是一般意义上的)。

弱类型意味着不做任何检查来确保操作可以在对象上成功。(例如,当一个函数访问一个字符串和浮点数组时,如果没有进行类型检查,则允许该操作)

编辑:这个答案发布已经 6 年了,我认为它需要一些额外的澄清:

多年来,开始使用“类型安全性不是绝对值”的概念来支持二进制含义(是/否)

与大多数典型的动态语言相比,Ruby 的类型“更强”(带有“er”)。事实上,ruby 需要显式的语句来转换 IE: Array("foo"), "42".to_i, Float(23),这使得 Ruby 打字拨盘比“弱类型”更接近“强类型”端.

所以我会说“Ruby 是一种比大多数常见动态语言更强大的类型化动态语言”

于 2009-02-06T14:10:03.263 回答
33

维基百科将其标记为“动态('鸭子')类型”。

关于波普关于它是“强类型”的评论——我不确定他的解释是否与幕后发生的事情相符。MRI 并没有真正“检查”是否可以对对象执行操作。它只是向对象发送消息,如果该对象不接受该消息(通过方法声明或在#method_missing 中处理它),它就会出错。如果运行时确实检查以确保操作是可能的,#method_missing 将不起作用。

另外,应该注意的是,由于 Ruby 中的一切都是对象(我的意思是一切),我不确定他所说的“不是 oo-sense”是准确的。在 Ruby 中,你要么是一个对象,要么是一条消息。

于 2009-02-06T21:46:53.200 回答
12

虽然您可以就这些术语的定义争论不休,但我想说:

Ruby 是动态且强类型的,而 JavaScript 是动态且弱类型的。

于 2009-02-06T14:06:22.740 回答
8

恕我直言 Ruby 是强但动态类型的。

于 2009-02-06T13:44:05.203 回答
3

我会考虑这些语言鸭子类型

于 2009-02-06T13:39:38.003 回答
1

过于简单的答案是 ruby​​ 和 javascript 都是弱类型的。

然而,这个问题并不像看起来那么明确——请参阅这篇维基百科文章,以更深入地讨论强类型语言和弱类型语言之间的区别。

于 2009-02-06T13:16:01.687 回答
1

我只是偶然发现了这个旧线程,但认为我可以提出我的意见是正确的。(不,我不是在“劫持”僵尸线程。)

我对术语“强类型™”的通俗解释特指“编译时间”。(这是当今许多语言(包括 Ruby)“根本没有的”。)

例如,一个简单的赋值语句,如编译器可以根据它对 and 的“类型”的评估,以及程序员提供的类型转换规定(如果适用)a = b;来判断是否可以接受。如果该语句被判断为不可接受,则会引发编译时错误,并且不会产生“可执行文件”。ab

当然,这个概念与诸如 Ruby、PHP、Perl、JavaScript 等语言的基本设计准则或当今广泛使用(并且非常成功)的许多其他语言不兼容。(请注意,我并不是说这是支持或反对他们的“判断”。他们就是他们,他们肯定会把培根带回家。)

因为这些语言没有“编译时间”,就我的(!)俗语来说,它们不能被称为“强类型”。他们有义务在运行时做出决定,根据他们的设计,这些决定不可能更早做出。


(另外请注意,我特别排除lint了为这种或那种语言而出现的各种“工具”,以便提前捕获更多错误。这些非常有用,是的,但不是一回事。 )

(出于同样的原因,我还特意排除了各种优秀的(!)工具,这些工具可以生成各种目标语言的源代码......出于同样的原因。)

而且——我再说一遍——我是在做一个分类,而不是一个判断。

于 2019-01-10T15:30:12.720 回答