ruby元編程——代碼塊

(1)Kennel#block_given?() 用於在方法執行期間判斷,是否傳入代碼塊,若是在block_given?()返回false時使用yield關鍵字,則會獲得一個運行時錯誤ruby

(2)閉包:塊只能看見和操做與本身綁定的變量,基於這樣的特性,叫閉包閉包

(3)Ruby1.8及之前版本,塊中參數變量會覆蓋綁定的塊綁定的相同變量名變量,Ruby1.9後已不會spa

(4)Kernel#local_variables()方法來跟蹤綁定的名字code

(5)在Java和C#中有「內部做用域」的概念,即內部做用域中能夠看到「外部做用域」中的變量,但Ruby中做用域是徹底隔離的對象

(6)Ruby中每當打開一個新的做用域時,全部以前做用域的綁定在新做用域中將不可用作用域

(7)程序會在三個地方關閉前一個做用域, 同時打開一個新的做用域:it

         類定義,模塊 定義, 方法調用class

(8)全局變量$開頭變量,能夠在任意做用域中訪問變量

(9)Ruby的四種種變量區別:module

    局部變量:綁定在做用域中,沒法跨做用域調用

    實例變量:@開頭,存在於對象中,在對象中均可以調用

    全局變量:$開頭,當賦值代碼被執行就一直存在,能夠在任意做用域調用

    類變量    :@@開頭, 被子類共用

(10)block兩大做用,跨做用域,代碼延遲執行

 (11)打破class做用域門: 使用Class.new + block

my_var = "Success"
MyClass = Class.new do
    p "#{ny_var}"
end

 (12)打破module做用域門: 使用Module.new + block

 (13)打破方法做用域門: define_method + block

 (14)Object#instance_eval()方法,用於將傳入的block當作實例方法執行,能夠使用instabce_eval + block從對象外改變對象的實例變量,例:

    class MyClass
        def initialize
            @v = 1
        end
    end
    
    obj = MyClass.new
    obj.instance_eval { @v = 2 }     #@v = 2

  (15)block 轉換 Proc方式

        (1)Proc.new { |x| x + 1 }

        (2)lambda { |x| x - 1 } (->(x) { x - 1 }  Ruby1.9之後)

        (3)proc { |x| x + 1 }

        (4)&入參

  (16)proc與lambda對比:

        (1)return的退出範圍,lambda退出block;proc退出block且退出此block綁定的做用域

        (2)proc對參數個數限制寬鬆,多了忽略,少了添nil;lambda拋出異常

  (17)Kernel#proc() 方法在Ruby1.8及之前版本是Kernel#lambda()別名,以後是Proc.new() 別名

  (18)object#method(:symbol) 能夠得到一個綁定的Method對象 ,Method#call調用,Method#unbind()解綁,返回一個UnboundMethod對象,須要調用bind()綁定一個對象才能調用,Method#to_proc將Method轉換成一個proc

相關文章
相關標籤/搜索