在ruby中的方法中获取局部范围,这是我的意思

时间:2013-03-07 09:36:13

标签: ruby scope

我正在从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将出现在方法范围内。 有什么想法吗?

2 个答案:

答案 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