2016-03-31 28 views
0

該方法沒有APIdock的描述。我知道Ruby中的instance_exec類似於JavaScript中的this綁定機制。插值方法定義

def interpolate(sql, record = nil) 
    if sql.respond_to?(:to_proc) 
     owner.instance_exec(record, &sql) 
    else 
     sql 
    end 
    end 

有人可以簡單描述一下嗎?

回答

1

首先,爲respond_to?(:to_proc)的檢查是必要的,以確保sql可能會被轉換爲拉姆達(由符號&要傳遞給instance_exec爲了簡化問題,人們可能在這裏把sql爲拉姆達已經:

def interpolate(sql, record = nil) # assume sql is lambda 
    owner.instance_exec(record, &sql) 
end 

如由文檔上instance_exec

執行給接收器的上下文中的給定塊...

這就是說,lambda將被執行,因爲它是序號代碼,放置在接收器的實例方法內。

class Owner 
    def initialize 
    @records = [:zero, :one, :two] 
    end 
end 

record_by_index = ->(idx) { @records[idx] } 
Owner.new.instance_exec 1, &record_by_index #⇒ :one 

上面的代碼是[或多或少]一個等效於:

class Owner 
    def initialize 
    @records = [:zero, :one, :two] 
    end 
    def record_by_index idx 
    @records[idx] 
    end 
end 

Owner.new.record_by_index(1) #⇒ :one 

調用的實際參數instance_exec將被傳遞到的碼塊。在Owner的實例中,我們可以訪問實例變量,私有方法等。希望它有幫助。