Ruby类的inheritance:什么是`<<(double less than)?

class << Awesomeness 

这是什么? 我search,但结果只告诉我关于string连接…

虽然class << something是singleton类的语法是正确的,正如别人所说,它最常用于在类定义中定义类方法。 但是这两个用法是一致的。 就是这样。

Ruby可以让你添加方法到任何特定的实例,通过这样做:

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

这为某些实例添加了一个foo方法,而不是它的类,而是添加到这个特定的实例。 (实际上,foo被添加到实例的“单例类”中,但这或多或less是一个实现的怪癖)。执行上面的代码之后,可以将foo方法发送给某个实例:

 someinstance.foo => "Hello." 

但是不能将foo发送给同一类的其他实例。 这就是<<名义上的”。 但是人们更常使用这个function来进行这样的句法体操:

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

当这个代码 – 这个类的定义 – 执行,什么是self ? 这是类的Thing 。 这意味着class << self ”就像说“给事物添加以下方法”一样。 也就是说,foo是一个类方法。 上述完成后,您可以这样做:

 t = Thing.new t.do_something => does something t.class.foo => "I am Thing" t.foo => NoMethodError: undefined method `foo' 

当你思考<<正在做什么<< ,这一切都是有道理的。 这是追加到特定实例的一种方式,在通常情况下,被追加的实例是一个类,所以块内的方法变成了类方法。

简而言之,在类定义块中创build类方法是一种简单的方法。 另一种方法是做到这一点:

 class Thing def self.foo # ... end end 

一样。 你的例子实际上是一个语法错误,但是如果你明白<<如何与实例和类关键字一起使用,你就会知道如何纠正它。

<<是“Singleton类定义”的语法。 以下是 “典型”使用地点/方式的示例 。

a = "abc"; a << "xyz" a = "abc"; a << "xyz"它是“附加数据”的语法(string,数组等)

如果你想inheritance(基于你的问题标题),你想要一个<

 class Awesome < ParentAwesomeness 

你提供的代码是无效的ruby:

 class Awesomeness end class Awesome << Awesomeness end SyntaxError: (irb):3: syntax error, unexpected tLSHFT, expecting '<' or ';' or '\n'