如果语句未在ruby 1.9中引入作用域,为什么?


Answers:


9

以下幻灯片显示了在Ruby 1.9中完成此操作的两个原因,尽管没有演示者的对话框可能并不明显。no scope if语句允许您做的两件事是在源代码中定义可以在if语句之外访问的内容。

第一个示例:替换方法

class Employee
  if String.method_defined?(:encode)
    def name
      ...
    end
  else
    def name
      ...
    end
  end
end

在此示例中,该方法有两种不同的定义name。如果该String.encode方法存在,则将使用一种方法;如果编码方法不存在,则将使用一种方法(劣等实现)。本质上,如果库支持,则可以使用正确编码的字符串。

第二个示例:替换实现

if String.method_defined?(:encode)
  module Builder
    ...
  end
else
  class String
    ...
  end
end

在此示例中,我们将根据是否存在库功能提供完全不同的类/模块。这样一来,您就可以拥有使用新库功能的完全不同的算法,同时仍然可以使用效率不高或不完整的算法(如果不存在的话)可以接近。

最重要的原因

那么,这能给您带来什么?如果该if语句引入了新的作用域,则该新方法或类将仅存在并在该if语句的范围内使用。这种限制使我们很难支持一个库,因为将来我们从1.9迁移到Ruby 2.0时,需要对Ruby 2.0进行更改。

通过链接到演示文稿中提供的两个示例,理由是在为库维护一个代码库的同时仍支持多个Ruby版本。我相信它是在Ruby 1.8和Ruby 1.9之间过渡的痛苦中诞生的。随着Ruby团队稳步向2.0迈进,当存在不兼容的更改时,您仍将能够为您的用户提供支持。我相信在1.9.1和1.9.2之间。将来会有更多。


1

我不是专家,但是如果您在这里查看Ruby FAQ:http : //arc.apotheon.org/ruby/faq/rubyfaq-2.php

第2.3节“何时可以访问局部变量?” 显示当前行为。

要解决范围问题,您当前要做的一件事是“稍作改动”:

建议您在访问局部变量之前,先放置a = nil之类的赋值语句,以免被局部变量的这种行为所困扰。

相信 1.9将消除这样做的必要,并且这可能是新行为的驱动因素之一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.