まず、respond_to?(:to_proc)
のチェックはsql
がinstance_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
のインスタンスでは、インスタンス変数、プライベートメソッドなどにアクセスできます。