为什么在代码a之前创建的class_eval访问权限world?
class Hello; end
a = Hello.new
Hello.class_eval {def world; puts "Hi" end}
b = Hello.new
a.world #=> "Hi"
b.world #=> "Hi"
Run Code Online (Sandbox Code Playgroud)
class_eval幕后工作如何?
红宝石中的类是开放的.作为Hello一个新的方法,给出了对所有实例的方法分派得到了与此更新.如果你想扩展a而已,叫class_eval上a的eigenclass:
class Hello; end
a = Hello.new
class << a; def world; puts "Hi" end end
# or, the equivalent:
# a.singleton_class.class_eval { def world; puts "Hi" end }
b = Hello.new
a.world #? "Hi"
b.world #? NoMethodError: undefined method `world' for #<Hello>
Run Code Online (Sandbox Code Playgroud)