Ruby是强类型还是弱类型语言?

34

Ruby是弱类型语言还是强类型语言?

JavaScript也可能是相同的情况。


1
你为什么认为它们会是相同的 - 因为Rails开发人员同时使用Ruby和Javascript吗? - Andrew Grimm
“strongly-typed”和“weakly-typed”是毫无意义的短语。 - ikegami
7个回答

50

Ruby被称为"强类型"语言。

强类型意味着在执行需要特定类型的操作之前,会检查对象的类型(不是面向对象编程中的类型,而是一般意义上的类型)。

弱类型意味着不会对对象进行任何检查以确保操作可以成功。例如,当函数访问类似于浮点数数组的字符串时,如果没有进行类型检查,则允许进行操作。

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

多年来,“类型安全是一个刻度而不是绝对”的概念开始被用来代替二进制的意义(是/否)

Ruby比大多数典型的动态语言更加“强”(使用“er”表示)。Ruby要求显式声明转换,例如Array("foo"), "42".to_i, Float(23),这使得Ruby的类型刻度更接近于“强类型”端而非“弱类型”端。

因此,我会说“Ruby是比大多数常见的动态语言更强类型的动态语言”。


感谢您的澄清,帮了大忙。:)给你点赞。 - Chirantan
30
静态类型并不意味着强类型。例如,C语言是静态类型的,因为编译器知道每个变量的类型,但它不是强类型的,因为内存只是内存,程序可以任意处理它。 - yfeldblum
抱歉挖出旧的讨论,但在涉及任何操作之前是否有任何运行时检查?当您编写像“abc”+[1,2,3]这样的代码时,只是String上的plus方法能否处理Array实例的问题。 - Anton
3
“Java是弱类型语言,任何人都可以将字符串添加到整数中并获得结果。”:这不是弱类型而是多态性。存在不同的“+”操作/方法,并根据操作数的类型进行分派。这与在C和C ++中将表示浮点数组的位字符串重新解释为某些结构不同。 - Giorgio
@PopCatalin:内存安全不等于类型安全——JavaScript在很多方面都是强类型的,但也有很多基于弱类型的工作(考虑自动强制转换);此外,你的回答让人感到困惑,好像强弱类型和静态动态类型在同一尺度上(关于“弱类型意味着没有检查”,这是错误的),它们并不是。实际上,从开始就有两种不同类型的弱类型,语言可以有一种或两种,因此至少有12种不同的组合可供语言“选择”。 - Erik Kaplun
显示剩余10条评论

35

维基百科将其标记为“动态(‘鸭式’)类型”。

关于Pop评论中它被称为“强类型” - 我不确定他的解释是否实际上符合底层发生的情况。MRI并没有真正“检查”对象上是否可以执行操作;它只是向对象发送消息,如果该对象不接受该消息(通过方法声明或在#method_missing中处理),则会出现错误。如果运行时实际上检查以确保操作是可能的,#method_missing就无法工作。

此外,应注意的是,由于Ruby中的所有内容都是一个对象(我确实指的是所有),我不确定他所说的“不是在面向对象的意义上”是否准确。在Ruby中,您要么是一个对象,要么是一条消息。


14

虽然你可以就这些术语的定义进行争论,但我认为:

Ruby是一种动态和强类型语言,而JavaScript是一种动态和弱类型语言。


我会说它们两者都是动态的、弱类型的,但是JS有更具攻击性的隐式类型转换。 - Tom Lord

8

我认为Ruby是一种强但动态类型的语言。


4

1

简单来说,Ruby和JavaScript都是弱类型语言。

然而,这个问题并不像看起来那么简单 - 可以参考这篇维基百科文章,深入讨论强类型语言和弱类型语言之间的区别。


2
似乎被以下内容所否定:http://www.rubyfleebie.com/ruby-is-dynamically-and-strongly-typed/越来越好奇了。 - weepy

1
我偶然发现了这个老帖子,但认为我可以提供我的意见。(不,我没有“劫持”僵尸线程。) 我的口语对术语“强类型™”的解释特别指的是“编译时间。”(这是许多今天的语言,包括 Ruby 在内的“根本没有的”东西。)
例如,一个简单的赋值语句,如a = b;,可以通过编译器的评估来判定是否可以接受,基于它对ab的“类型”的评估,并基于程序员提供的类型转换的规定(如果适用)。如果该语句被判定为不可接受,则会抛出编译时错误,永远不会产生“可执行文件”。
当然,这个想法与诸如 Ruby、PHP、Perl、JavaScript 或许多其他极为广泛(且极为成功)使用的语言的基本设计原则不兼容。(请注意,我并不是在对它们进行“判断”,无论是支持还是反对。它们是什么,它们肯定可以带回家糊口。)
因为这些语言没有"编译时",按照我自己的说法,它们不能被称为"强类型"。它们被迫在运行时做出决策,这些决策根据它们的设计早先无法做出。
(还请注意,我特别排除了各种针对不同编程语言的“lint工具”,试图提前捕捉更多的错误。是的,它们非常有用,但并不是同一回事。)
(出于同样的原因,我也故意排除了各种优秀的工具,可以在各种目标语言中生成源代码。)
而且 - 我再次强调 - 我正在进行分类,而不是判断。

只是一个小修正,PHP从v7开始就支持严格类型,所以我相信大约是在2015年左右 - 甚至在那之前,所有好的IDE都能够使用注释中的元数据来进行代码的静态分析。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接