此方法没有关于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
有人可以简单描述一下吗?
答案 0 :(得分:1)
首先,检查respond_to?(:to_proc)
是必要的,以确保sql
可能会转换为lambda(通过&符号&
传递给instance_exec
。事情,人们可能会在这里将sql
视为一个lambda:
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
实例的上下文中,我们可以访问实例变量,私有方法等。希望它有所帮助。