如果语句未在Ruby 1.9中引入作用域,那么从ruby 1.8进行更改的原因是什么?
如果语句未在Ruby 1.9中引入作用域,那么从ruby 1.8进行更改的原因是什么?
Answers:
以下幻灯片显示了在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之间。将来会有更多。
我不是专家,但是如果您在这里查看Ruby FAQ:http : //arc.apotheon.org/ruby/faq/rubyfaq-2.php
第2.3节“何时可以访问局部变量?” 显示当前行为。
要解决范围问题,您当前要做的一件事是“稍作改动”:
建议您在访问局部变量之前,先放置a = nil之类的赋值语句,以免被局部变量的这种行为所困扰。
我相信 1.9将消除这样做的必要,并且这可能是新行为的驱动因素之一。