class << Awesomeness
What is this << for? I searched, but the results only tell me about string concatenation...
<<
<<是 “单例类定义”.这里有一个例子“通常”使用的位置/方式的语法。
In a = "abc"; a << "xyz" it is the syntax for "appending data" (to string, array etc.)
a = "abc"; a << "xyz"
如果你想继承(基于你的问题题名) ,你需要一个单一的 <:
<
class Awesome < ParentAwesomeness
您提供的代码不是有效的 Ruby:
class Awesomeness end class Awesome << Awesomeness end SyntaxError: (irb):3: syntax error, unexpected tLSHFT, expecting '<' or ';' or '\n'
虽然 class << something确实是一个单例类的语法,但正如有人所说,它最常用于在类定义中定义类方法。但这两种用法是一致的。我来告诉你怎么做。
class << something
Ruby 允许您通过以下方式向任何特定实例添加方法:
class << someinstance def foo "Hello." end end
这会将一个方法 foo添加到某个实例中,不是添加到它的类中,而是添加到那个特定的实例中。(实际上,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 是一个类方法。完成以上步骤后,你可以这样做:
self
Thing
class << self
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 关键字一起使用,那么您将知道如何纠正它。