繁体   English   中英

插值方法定义

[英]Interpolate Method Definition

此方法在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

有人可以简要描述一下吗?

首先,必须进行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实例的上下文中,我们可以访问实例变量,私有方法等。希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM