JavaScript需要Blocks

英文出自:yehudakatz.com,编译:CSDN赵红

常常会遇到有人将Ruby的区块(Blocks)看作相当于JavaScript的“first class functions ”的误解。由于传递功能,尤其是当你可以创建匿名的传递功能,这是非常强大的。事实上,JavaScript和Ruby有一个机制使其自然会认为等值。

人们在谈到为什么Ruby的区块不同于Python的函数时,通常会讲到一些关于Ruby和JavaScript的匿名分享,但Python没有。初看之下,一个Ruby区块就是一个“匿名函数”(或俗称一个“封装”),正如JavaScript函数就是其中之一。

作为一个早期的Ruby/JavaScript开发者,无可否认我也有过这样的观点分享。错过一个重要的细节,对结果会产生较大影响。这个原理常被称为“Tennent’s Correspondence Principle”,这条原理说:“For a given expression expr, lambda expr should be equivalent.”这就是被称为抽象的原则,因为这意味着,用“区块”的方法很容易重构通用代码。例如,常见文件资源管理的情况。试想在Ruby中,File.open块形式是不存在的,你会看到以下代码:

乍一看,在Ruby和JavaScript中确实如此。例如,假设你正在使用的文件打印它的mtime。您可以轻松地重构相当于在JavaScript:

到这里:

事实上,这样的情况往往给人错误的印象,Ruby和JavaScript有同样用匿名函数重构常用功能的能力。

不过,再来一个稍微复杂一些的例子。我们首先在Ruby中编写一个简单的类,计算文件的mtime和检索它的正文: