最近学んだ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は使いどころがまだないけど...。

hagiyat師匠に教えてもらって、Rubyコネコネしてるの楽しいです。