1

私はこのラムダを持っています:

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'

しかし、このラムダ メソッドで my_funky_lambda.rb を実行すると、NameError が発生します。このラムダのスコープがどうなっているのかわかりませんが、からアクセスできないようですis_there_an_echo_in_here

echo_word定数ECHO_WORDにしてそのように使用すると、適切にスコープされて使用されますが、より簡単な解決策が必要です。

このシナリオでは、echo_word内部からラムバにアクセスする最良の方法is_there_an_echo_in_hereは何ですか?たとえば、モジュールにラップする、グローバル スコープにアクセスする、その他の方法は?

4

1 に答える 1

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
于 2013-03-20T21:30:48.507 に答える