Ruby单例类

sli*_*000 3 ruby singleton-methods

我不确定这个之间的区别.

def String.hello  
  puts "hello there"   
end
Run Code Online (Sandbox Code Playgroud)

x = Person.new    
def x.hello    
  puts "hello there"    
end
Run Code Online (Sandbox Code Playgroud)

根据我的理解,第二个代码块将创建Person类的对象.当我执行def x.hello时,它会创建一个匿名类(单例类),在向x对象发送消息时,将首先检查方法.

def String.hello的情况是否相同?String只是类Class的实例正确吗?我已经读过,做def String.hello会将方法添加为String的类方法之一....这与创建的匿名类不同,后者位于对象及其类之间,获取其实例方法.

上面的两个代码块会发生什么?

Mat*_*ggs 6

我喜欢这部分红宝石.有这种美丽的对称性,其中大多数核心功能只是高级功能的糖,所以一旦你完全理解了一个概念,你就可以将这种理解应用到很多语言中.

def String.hello的情况是否相同?String只是类Class的实例正确吗?

是的,您正在创建Class的实例,并将其分配给常量.

我已经读过,做def String.hello会将方法添加为String的类方法之一....这与创建的匿名类不同,后者位于对象及其类之间,获取其实例方法.

不,你缺少的部分是认为有可能有一个类级方法而不将它添加到单例类.你所拥有的是一个对象,它是一个Class的实例,你将方法添加到位于它和Class之间的隐式类.您有时也会看到这种语法

class << self
  def method
  end
end
Run Code Online (Sandbox Code Playgroud)

这是做同样的事情,只是非常明确.