我有这个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的最佳方式是什么,例如将它包装在一个模块中,访问全局范围,还有什么?
答案 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