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さん
rand % 2と成っているからではないかと。<br>正しくはrand(2)ではないでしょうか。
まえに氏久くんが似たような事をやってた記憶が。。。<br><br>(rand(10) % 2 == 0 ? String : Array)<br><br>にしたらランダムになりましたよ