如何正确定位Ruby lambda?

时间:2013-03-20 21:24:09

标签: ruby lambda

我有这个lambda:

echo_word = lambda do |words|
  puts words
  many_words = /\w\s(.+)/
    2.times do
      sleep 1
      match = many_words.match(words)
      puts match[1] if match
    end
  sleep 1
end

我希望将其作为一个块传递给each,并且将来每个块都会更多。

def is_there_an_echo_in_here *args
  args.each &echo_word # throws a name error
end

is_there_an_echo_in_here 'hello out there', 'fun times'

但是当我用这个lambda方法运行my_funky_lambda.rb时,我得到一个NameError。我不确定这个lambda的范围是什么,但我似乎无法从is_there_an_echo_in_here访问它。

echo_word如果我将其设为常量ECHO_WORD并且使用它就是正确的范围并使用,但必须有一个更简单的解决方案。

在这种情况下,从echo_word内部访问is_there_an_echo_in_here lamba的最佳方式是什么,例如将它包装在一个模块中,访问全局范围,还有什么?

1 个答案:

答案 0 :(得分:5)

在Ruby中,常规方法不是闭包。因此您无法在echo_word内拨打is_there_an_echo_in_here

然而,块是闭包。在Ruby 2+中,您可以这样做:

define_method(:is_there_an_echo_in_here) do |*args|
  args.each &echo_word
end

另一种方法是将echo_word作为参数传递:

def is_there_an_echo_in_here *args, block
  args.each &block
end

is_there_an_echo_in_here 'hello out there', 'fun times', echo_word