在方法定义之前创建的实例

mha*_*eeb 0 ruby

为什么在代码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幕后工作如何?

Ale*_*kin 6

红宝石中的类是开放的.作为Hello一个新的方法,给出了对所有实例的方法分派得到了与此更新.如果你想扩展a而已,叫class_evala的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)

  • 你不需要`class_eval {`...`}`. (2认同)