EasyTime - Ruby学习笔记
自我介绍
切换风格
订阅我的Blog
博客日历
文章归档...
最新发表...
博客统计...
网站链接...
资源
===========================================================
Blocks, Closures and Proc Objects
===========================================================

Blocks, Closures and Proc Objects

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 物件, 你就可以當成一般參數哂
  • my4java 发表于:2006.04.09 22:37 ::分类: ( Ruby学习 ) ::阅读:(812次) :: 评论 (2) :: 引用 (0)
    re: Blocks, Closures and Proc Objects [回复]

    不错,好文

    Jason 评论于:2007.01.15 19:50
    re: Blocks, Closures and Proc Objects [回复]

    同C语言的回调机制比较起来Ruby的block的设计风格要更加精巧和容易管理

    oliver 评论于:2006.06.20 22:57

    发表评论
    标题

    在此添加评论

    称呼

    邮箱地址(可选)

    个人主页(可选)

    authimage