rutoの日記: RubyでScalaの_っぽいこと。
日記 by
ruto
こんなん作った。hello.rb
これは、
foo1 = procedure do foo(1, _, _) end
と書くと
foo1 = proc do |x, y| foo(1, x, y) end
とほぼ同じことになる。
途中で例外が起きたり、callccを使うと変になるはず。
あと、
procedure do 2.times do p _ end end
は1引数手続きではなく2引数手続きになって、_の値は1回目のループでは1つめの引数、2回目のループでは2つ目の引数になる。
shift/reset言いたかっただけなので、実はもっと簡単に書ける。
def procedure
proc do |*args|
old_index = Thread.current[:index]
old_args = Thread.current[:args]
Thread.current[:index] = 0
Thread.current[:args] = args
begin
yield
ensure
Thread.current[:index] = old_index
Thread.current[:args] = old_args
end
end
end
def _
Thread.current[:index] += 1
Thread.current[:args][Thread.current[:index] - 1]
end
これは例外には対応しているけど、やっぱりcallccに対応していない。
RubyでScalaの_っぽいこと。 More ログイン