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
相关产品推荐
相关产品推荐

