Ruby 的 block 是個不錯的設計. 一個 block 就是一些程式碼, 其 context 為正在動態執行的環境. 有點像是一般稱為 callback 機制, 但 block 方法精巧多了



當你呼叫 method 時, 你可以給它一個 block. 下面 “each” 是 method, do ~ end 中間就是 block, |x|, x 就是傳給 block 的參數.
books = ["Ruby", "Rails"]
books.each do |b|
  puts b
end


那麼 method 裡如何執行 block? 利用 “yield”

def three_times
  for i in 1..3 do 
    yield i
  end
end

#invoke
three_times do |i|
  puts "#{i}, see you!" 
end

那要是你的 method 不論有沒有 block 都可以接受的話, 你就要用 block_given? 來測試
class File
  def self.my_open(*args)
    result = f = File.new(*args)
    if block_given?
      result = yield f
      f.close
    end

    return result
  end
end

File.my_open("x.txt", "w") { |f|
  f.puts "Hello World!" 
}

另外 block 會被 Ruby 轉成參數列的最後一個參數. Ruby 會幫你把 block 轉成 Proc 物件, 你就可以當成一般參數哂? 範例中 “&block” 是標準寫法, Ruby 才會給你名為 “block” 的 Proc 物件, 你就可以 nil? 或呼叫 “call” 執行 block.
def n_times(n, &block)
  #puts block.inspect
  i = 1
  while i <= n do
    block.call i
    i+=1
  end
end

n_times(5) do |i|
  puts "#{i}, see you!" 
end
专家
评论
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

litoueva
搜索本博客
最近加入圈子
存档
最新评论