首先,爲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
的實例中,我們可以訪問實例變量,私有方法等。希望它有幫助。