You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby DSL中instance_eval的工作机制及config变量访问疑问

Ruby中instance_eval与DSL里config访问的问题解析

先修正你代码里的笔误(I|=是输入错误,正确应为||=),整理后的代码如下:

class Rails
  def self.configure (&block)
    instance_eval(&block)
  end 
  def self.config
   @config ||= {}
  end
end
# 注:原代码中`Rails.yes`是无效调用,此处忽略
Rails.configure do 
  config["feature"] = true
end

问题1:为什么无需加类名前缀就能访问config?

核心原因是instance_eval改变了代码块内的self指向:

  • Rails.configure方法里调用了self.instance_eval(&block),这里的self就是Rails类本身,instance_eval会让传入的代码块直接在Rails类的上下文中执行。
  • 块内的self等价于Rails类,而config是Rails的类方法(通过def self.config定义),所以直接写config就等同于self.config,也就是Rails.config,自然不需要额外的类名前缀。

问题2:config方法在哪里被调用?

就在代码块里的config["feature"] = true这一行。
执行这行代码时,因为块内self是Rails类,config会直接触发对Rails类方法config的调用,拿到@config哈希对象后,再完成键值对的赋值操作。

内容的提问来源于stack exchange,提问作者Aaquib Jawed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:01:07