最近学んだRuby
Rangeの範囲
p (1..10).to_a p (1...10).to_a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [1, 2, 3, 4, 5, 6, 7, 8, 9]
多重代入とflatten
複数の引数でも、配列でも、どっちでも引数にとれて便利
def f(*params) params.flatten.reduce { |sum, v| sum + v } end p f 10, 20, 30 p f [10, 20, 30] p f 10, [20, 30]
60 60 60
Proc#curry
- カリー化したProcオブジェクトを返す
def f(&block) b1 = block.curry p b1.class #=> Proc b2 = b1.(10) p b2.class #=> Proc # f(10, x, y) みたいな状態 b3 = b2.(20) p b3.class #=> Proc # f(10, 20, y) みたいな状態 p b3.(30) #=> 60 p b3.class #=> Proc # f(10, 20, 30) みたいな状態 b4 = b3.(30) p b4.class #=> Fixnum # f(10, 20, 30) の実行結果、60の型だから p block.curry.('あ').('べ').('し') #=> "あべし" end f { |x, y ,z| x + y + z } # こういうのはそもそできない # f { |*x| x.reduce { |sum, v| sum + v } }
Proc Proc Proc 60 Proc Fixnum "あべし"
Proc#curryは使いどころがまだないけど...。