Ruby Block的變形與使用


#1

首先,基本型

x = lambda{|y| puts y }
x.class
  #=> Proc
x.call(123)
  #=> 123
x.(123)  #非正規用法
  #=> 123

這邊可以看得出來lambda的原型是Proc,且Proc的default method就是call

然後仿.each疊代器的實作方式

def im_loop(ary , &block)
  while temp = ary.pop
    block.call(temp)
  end
end

im_loop (1..10).to_a do |i|
  puts i
end
#=> 10 , 9 , ... , 2 , 1 #要顛倒就把 ary.pop 換成 ary.shift 即可

im_loop (1..10).to_a
#=> NoMethodError: undefined method `call' for nil:NilClass

另外是 yield 的寫法,其實就是再把 &block 的寫法簡化

def im_yield
  yield :yooo
  yield(:yooo)
end

im_yeild do |name|
  puts name
end
#=> yooo \n yooo

im_yeild
#=> LocalJumpError: no block given (yield)

這就是 Ruby 的 block 的原型與使用方式,其實類似 JavaScript 或是其他語言的 anonymous function ( 匿名函數 ),而用這種方式來寫作的好處是裡面的程式通常不用管實作,而是用的時候才去定義,所以不管是 each 或是 Rails 下的 layout 的 content_for :name 配上 yield :name 的用法,其實都是 call block 的實現就是


method / block / yield / Proc / lambda 全面解釋
#2
im_loop (1..10).to_a do |i|
  puts i
end

im_loop(1..10) 之間有空白要注意 XD