插值方法定义

时间:2016-03-31 05:12:58

标签: ruby-on-rails ruby

此方法没有关于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 个答案:

答案 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实例的上下文中,我们可以访问实例变量,私有方法等。希望它有所帮助。