Ruby class inheritance: What is `<<` (double less than)?

class << Awesomeness

What is this << for? I searched, but the results only tell me about string concatenation...

23007 次浏览

<<“单例类定义”.这里有一个例子“通常”使用的位置/方式的语法。

In a = "abc"; a << "xyz" it is the syntax for "appending data" (to string, array etc.)

如果你想继承(基于你的问题题名) ,你需要一个单一的 <:

class Awesome < ParentAwesomeness

您提供的代码不是有效的 Ruby:

class Awesomeness
end


class Awesome << Awesomeness
end


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

虽然 class << something确实是一个单例类的语法,但正如有人所说,它最常用于在类定义中定义类方法。但这两种用法是一致的。我来告诉你怎么做。

Ruby 允许您通过以下方式向任何特定实例添加方法:

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

这会将一个方法 foo添加到某个实例中,不是添加到它的类中,而是添加到那个特定的实例中。(实际上,foo 被添加到实例的“单例类”中,但这或多或少是一种实现怪癖。)在执行上述代码之后,您可以将方法 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 关键字一起使用,那么您将知道如何纠正它。