Procとかlambdaとか

ハチドリ本にあった例。けっこうわかりやすいかも。

def sequence2(n, m, c)
  i = 0
  while(i < n)
    yield i*m + c
    i += 1
  end
end
puts "sequence2"
sequence2(5, 2, 2) {|x| puts x}

def sequence3(n, m, c, &b)
  i = 0
  while(i < n)
    b.call(i*m + c)
    i += 1
  end
end
puts "sequence3"
sequence3(5, 2, 2) {|x| puts x}

def sequence4(n, m, c, b)
  i = 0
  while(i < n)
    b.call(i*m + c)
    i += 1
  end
end
puts "sequence4"
p = Proc.new {|x| puts x}
sequence4(5, 2, 2, p)

puts "sum"
a, b = [1, 2, 3], [4, 5]
sum = a.inject(0) {|total, x| total+x}
puts sum
sum = b.inject(sum) {|total, x| total+x}
puts sum

puts "sumation"
a, b = [1, 2, 3], [4, 5]
sumation = Proc.new {|total, x| total+x}
sum = a.inject(0, &sumation)
puts sum
sum = b.inject(sum, &sumation)
puts sum

puts "Proc"
p = Proc.new {|x, y| print x, y}
p.call(1)
p.call(1, 2)
p.call(1, 2, 3)

print "\n"

puts "lambda"
l = lambda {|x, y| print x, y}
#l.call(1) とやるとin `call': wrong number of arguments(1 for 2) (ArgumentError)っていわれる
l.call(1, 2)
#l.call(1, 2, 3) とやるとin `call': wrong number of arguments(3 for 2) (ArgumentError)っていわれる

実行結果

sequence2
2
4
6
8
10
sequence3
2
4
6
8
10
sequence4
2
4
6
8
10
sum
6
15
sumation
6
15
Proc
1nil1212
lambda
12