Josh Susserから次の例を取り上げました。
def strip_accents params
thunk = lambda do |key,value|
case value
when String then value.remove_accents!
when Hash then value.each(&thunk)
end
end
params.each(&thunk)
end
Railsコンソール(irb)に入れ、ハッシュで呼び出すと、次のようになります。
ruby-1.9.2-p136 :044 > `ruby --version`
=> "ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux]\n"
ruby-1.9.2-p136 :045 > strip_accents({:packs=>{:qty=>1}})
ArgumentError: wrong number of arguments (1 for 2)
from (irb):32:in `block in strip_accents'
from (irb):37:in `each'
from (irb):37:in `strip_accents'
from (irb):45
from /longpathtrimedforclarity/console.rb:44:in `start'
from /longpathtrimedforclarity/console.rb:8:in `start'
from /longpathtrimedforclarity/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
ラムダがアリティをチェックすることは理解していますが、ラムダの定義に 2 つの引数があります。に変更lambda do
するとProc.new do
、コードが実行され、期待される結果が得られます。
Josh の例は 2008 年のものなので、これは Ruby 1.8 と 1.9 の違いだと思います。何が起きてる?