5

一方面是 Java,另一方面是 Ruby/Groovy,我知道在第二个阵营中,我可以自由地打错字,直到运行时才会被发现。所有动态类型语言都是这样吗?

编辑:我被要求详细说明错字的类型。在 Ruby 和 Groovy 中,您可以将一个从未读取过的意外名称分配给一个变量。你可以调用不存在的方法(显然你的测试应该捕捉到这一点,据说)。您可以引用不存在的类等。基本上任何有效的语法,即使有印刷错误,在 Ruby 和 Groovy 中都是有效的。

4

4 回答 4

3

在 Perl 中,如果您use strict在代码中声明,则必须使用my. 变量名中的错别字将在编译时被捕获。这是我在 Python 中编码时最想念的事情之一。

于 2010-03-11T22:26:07.690 回答
3

Python是typo-friendly您在问题中描述的方式。

但这并不意味着这些“错别字”只能在@runtime 时被捕获。当使用pylint 之类的代码分析器(理想地集成到您的开发环境中)时,您将在点击“运行”之前始终如一地捕获其中的“大部分”。

于 2010-03-11T23:15:46.127 回答
2

多半是对的。动态类型和不需要声明变量是经常一起发现的语言属性。

然而,这些本质上并不相关。一种语言可以很容易地进行动态类型化,同时要求在使用前声明变量名。正如 ire_and_curses 所提到的,这可以通过“use strict”指令在 Perl 中实现。

于 2010-03-11T22:39:48.313 回答
2

以下是当我尝试进入您在SqueakDolphin中提到的陷阱时会发生的情况,这是动态语言Smalltalk 80的两种实现。

您可以分配给一个从未读取过的意外名称的变量

Smalltalk 语言需要声明临时变量和实例变量。如果我尝试编译包含未定义变量的方法,则会出现编译时错误。

| anArray |
anArrray := Array with: 2 with: 1. "Unknown variable anArrray"

动态创建变量不是动态语言必须允许的。无类型声明和完全没有声明是有区别的。


你可以调用不存在的方法

如果您使用完全未知的选择器(即方法名称),编译器会发出警告。

paint如果我在数组上调用该方法,编译器不会打扰,因为系统中有另一个类实现paint. 该错误只会在运行时被捕获。

但是,如果我调用该方法sortt(当我打算调用时sort),编译器会生成一个警告。在自上而下开发时,您可以继续传递这些警告。

| anArray |
anArray := Array with: 2 with: 1.
anArray paint. "Runtime error. You can't paint an array but perhaps a Shape"
anArray sortt. "Compile-time warning"

你可以参考不存在的类

这是不允许的。尽管在 Squeak 中,如果需要,您可以从错误对话框中快速创建一个新类。

于 2010-03-11T23:04:05.740 回答