2016-03-31 9 views
0

このメソッドには、APIドックの説明がありません。 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)のチェックはsqlinstance_execに渡されるアンパサンド&によって(ラムダに変換される可能性があります物事を単純化するために、1がすでにラムダであるとして、ここでsqlを扱うかもしれないことを確認する必要がある。

instance_execのドキュメントによるよう
def interpolate(sql, record = nil) # assume sql is lambda 
    owner.instance_exec(record, &sql) 
end 

は、受信機のコンテキスト内で指定されたブロックを実行...

つまり、ラムダは、受信者のインスタンスメソッドのどこかに配置された序数コードと同じように実行されます。コードブロックに渡されるinstance_execへの呼び出しの

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 

実パラメータ:

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 

コードは、上記[多かれ少なかれ]と等価です。 Ownerのインスタンスでは、インスタンス変数、プライベートメソッドなどにアクセスできます。

関連する問題