トップ «前の日記(2007-11-15) 最新 次の日記(2007-11-17)» 編集

Route 477



2007-11-16

[ruby] Pattern Matching in Ruby (via jijixi's diary)

フィボナッチ:

def fib(n)
  match n do
    with(0) {0}
    with(1) {1}
    otherwise {fib(n-1) + fib(n-2)}
  end
end

木構造のダンプ:

def disp(tree)
  match tree do
    with(:num & Fixnum) {num}
    with([:left, :op & String, :right]){"(#{disp(left)} #{op} #{disp(right)})"}
    otherwise {"Invalid tree structure"}
  end
end

Haskell関西方面でウケが良さそう。

[ruby] ランダムに変わるスーパークラス?

class A < (rand % 2 == 0 ? String : Array)

end

[soutaro#nikki()より引用]

ええっこんなことできんの!?と思ったが:

yhara@meteor:~/tmp % ruby randklass.rb
[A, Array, Enumerable, Object, Kernel]
yhara@meteor:~/tmp % ruby randklass.rb
[A, Array, Enumerable, Object, Kernel]
yhara@meteor:~/tmp % ruby randklass.rb
[A, Array, Enumerable, Object, Kernel]

Arrayしか出てこないな。

11/18追記:と思ったらコメント欄で「randの使い方が間違ってる」という指摘が。

yhara@meteor:~/tmp % irb
>> rand
=> 0.775069450639572
>> rand
=> 0.79447336084156
>> rand
=> 0.396552445835088
>> rand % 2
=> 0.236850289302209
>> rand % 2
=> 0.879164452414756

そうか、rand()は0〜1までの数を返すんだっけ…。「0か1」が欲しいならrand(2)としなければならないと。

class A < (rand(2) == 0 ? String : Array)
  p self.ancestors
end

これでおk?

yhara@meteor:~/tmp % ruby randklass.rb
[A, String, Enumerable, Comparable, Object, Kernel]
yhara@meteor:~/tmp % ruby randklass.rb
[A, Array, Enumerable, Object, Kernel]
yhara@meteor:~/tmp % ruby randklass.rb
[A, String, Enumerable, Comparable, Object, Kernel]
yhara@meteor:~/tmp % ruby randklass.rb
[A, String, Enumerable, Comparable, Object, Kernel]
yhara@meteor:~/tmp % ruby randklass.rb
[A, Array, Enumerable, Object, Kernel]

なんという動的言語。

ご指摘ありがとうございました>konnさん、okkezさん

本日のツッコミ(全2件) [ツッコミを入れる]
konn (2007-11-16 21:12)

rand % 2と成っているからではないかと。<br>正しくはrand(2)ではないでしょうか。

okkez (2007-11-16 23:00)

まえに氏久くんが似たような事をやってた記憶が。。。<br><br>(rand(10) % 2 == 0 ? String : Array)<br><br>にしたらランダムになりましたよ