パスワードを忘れた? アカウント作成
43310 journal

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に対応していない。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

最初のバージョンは常に打ち捨てられる。

読み込み中...