class << Awesomeness

这个<<是做什么用的?我搜索了,但是结果只告诉我有关字符串连接的信息...

最佳答案

确实有人说class << something是单例类的语法,正如其他人所说,它最常用于在类定义中定义类方法。但是这两种用法是一致的。就是这样。

Ruby允许您通过执行以下操作将方法添加到任何特定实例:

class << someinstance
  def foo
    "Hello."
  end
end

这将foo方法添加到某个实例,而不是添加到其类,而是添加到该特定实例。 (实际上,将foo添加到实例的“singleton类”中,但这或多或少是一个实现怪癖。)执行以上代码后,可以将foo方法发送给某些实例:
someinstance.foo   => "Hello."

但您不能将foo发送到同一类的其他实例。这就是<<名义上的用途。但是人们更普遍地将此功能用于语法体操,例如:
class Thing
  def do_something
  end

  class << self
    def foo
      puts "I am #{self}"
    end
  end
end

当此代码(此类定义)执行时,self是什么?这是Thing类。这意味着class << self与说“在Thing类中添加以下方法”相同。也就是说,foo是一个类方法。完成上述操作后,您可以执行以下操作:
t = Thing.new
t.do_something  => does something
t.class.foo     => "I am Thing"
t.foo           => NoMethodError: undefined method `foo'

当您考虑<<在做什么时,这一切都是有道理的。这是追加到特定实例的一种方法,在通常情况下,追加到的实例是一个类,因此该块中的方法成为类方法。

简而言之,这是在类定义块中创建类方法的简洁方法。另一种方法是这样做:
class Thing
  def self.foo
    # ...
  end
end

一样。您的示例实际上是一个语法错误,但是如果您了解<<与实例和class关键字一起使用的方式,那么您将知道如何更正它。

关于ruby - Ruby类继承: `<<`(小于两倍)是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6182628/

10-12 07:34
查看更多