Ruby勉強

インターネットの企画職な人がプログラミングを勉強するブログ

Rubyブロック#2 - Silver/Gold試験対策

def hoge(a, b, &fuga)
  fuga.call(a*b)
end

hoge(2, 3) {|arg|
  puts "a,bを掛け算して#{arg}でした"
}

def bar(a, b)
  puts yield(a*b)
end

hoge(2, 3) {|arg|
  puts "a,bを掛け算して#{arg}でした"
}

procオブジェクトの実行には & + callでも yieldでもどちらでも可能

以下のすべてがprocオブジェクト。なぜこれだけあるのか。

a = lambda {|n| n**n}
b = proc {|n| n**n}
c = Proc.new {|n| n**n}
d = ->n{n**n}

p a.call(2)
p b.call(2)
p c.call(2)
p d.call(2)

&は、各クラスのto_procを実行するので 整数クラスのto_procを上書きしてみる

class Fixnum
  def to_proc
    ->n{ self * n }
  end
end
def proc_func(a, &b)
  b.call(a)
end
p proc_func(2,&3) #=> 6

&のショートカット記載方法。 以下の各々2つは同じ意味

require 'prime'

p (1..100).select {|i|
  i.prime?
}
p (1..100).select(&:prime?)

p %w(Alpha Bravo Charlie).map{|name|
  name.upcase
}
p %w(Alpha Bravo Charlie).map(&:upcase)

p (1..100).select(&:prime?)は、p (1..100).select(&(:prime?))と同じだと思うが &は何のメソッドだろう。。