我正在从PERL转换为Ruby。 PERL中我喜欢的一件事就是能够通过使用我的命令在sub中拥有本地范围。 I.E.此代码无效,因为$ only_in_the_if超出范围。
...
if (cond) {
my ($only_in_the_if) = bar($foo );
}
bar1($only_in_the_if) ; #can't work, $only_in_the_if scope is finished
...
在Ruby中,only_in_the_if将出现在方法范围内。 有什么想法吗?
答案 0 :(得分:0)
简单范围显然不属于有条件的......
irb(main):001:0> if my_cond
irb(main):002:1> my_var = 'blah'
irb(main):003:1> puts my_var
irb(main):004:1> end
blah
=> nil
irb(main):005:0> puts my_var
blah
=> nil
但是你可以使用一个块强制确定范围...即使它有点奇怪。
irb(main):006:0> 1.times { new_var = 'blah'; puts new_var } if my_cond
blah
=> 1
irb(main):007:0> new_var
NameError: undefined local variable or method `new_var' for main:Object
from (irb):7
from :0
如果你愿意,你可以将其编程为一个名为“my”的方法;)
答案 1 :(得分:0)
Ruby的代码块与Perl和AFAIK不同,没有简单的方法可以声明性地将变量范围仅限于复合语句(例如if)中的词法。
您可以使用Taryn建议的代码块。我不确定这个好处是否会超过成本(就执行速度和其他Ruby开发人员的工作方式而言不同)。
另一个简单的解决方案是保持复合语句的轻量级,并依靠更短的方法来实现紧凑的变量范围。在Perl中,您可能会编写一个30行的方法,在ifs和fors中只有4或5行的子块,而在Ruby中,可以使用具有主流的控制方法完成相同的流程和范围,以及几个变量作用域的私有方法。这些方法之间共享的数据可以是对象状态(在@变量中)或控制方法中的作用域变量,它们作为参数传递给私有方法。
def main_method foo
if (cond)
bar foo
end
end
private
def bar param
only_in_bar = Math.whatever(param)
# Do some stuff with only_in_bar
end