标题提得比较绕,因为确实有点不知道该怎么概括这个问题,见谅呀。 我提的这个问题发自于这样的思考: 弱/动态类型的语言声明变量时,不似传统语言有精确的作用域,一旦写好就不会改变,而是不同程度依赖代码的上下文。我接触过的弱类型语言有 javascript 和 ruby。javascript 中使用 var 来声明临时变量或不使用关键字直接声明外层变量;ruby 不需要使用关键词来声明变量。那么我在实际的编码过程里遇到了类似以下的情况:
一段 if 或者 while 的逻辑,会依据不同结果将相应的不同的值赋给一个或多个临时变量,然后由其他的方法来使用或者返回这个值给客户端。类似下面的逻辑:
if_or_while_some_expressions do |object|
result = some_functions object
else
result = another_functions object
end
render_result result
目前我们的这段代码在 ruby1.9.3 中能够正常工作,但我是否需要提防以后版本的 ruby 中会抛出没有 result 这个变量,或者由于作用域的原因而导致 result 的值混成了外层的某个值呢(因为很多其他语言中,if-else 块或者 while 块里的变量只要出了块就会消失,这也符合常识,而 ruby 这种即使出了 if 范围仍然保留本地变量的做法显得不那么大众)。 也就是说,有没有必要写成以下的形式:
result = "" # 或者写成result=nil或者其他的形式,只要赋个初始值就行
if_or_while_some_expressions do |object|
result = some_functions object
else
result = another_functions object
end
render_result result
用以避免可能造成的作用域模糊呢?