class << Awesomeness
这是<<
的内容是什么?我搜索了,但结果只告诉我字符串连接......
答案 0 :(得分:128)
虽然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关键字一起使用,您将知道如何更正它。
答案 1 :(得分:19)
<<
是"Singleton class definition"的语法。 Here is an example“通常”使用的地点/方式。
在a = "abc"; a << "xyz"
中,它是“追加数据”(字符串,数组等)的语法。
答案 2 :(得分:18)
如果你想继承(基于你的问题标题),你想要一个<
:
class Awesome < ParentAwesomeness
您提供的代码不是有效的红宝石:
class Awesomeness
end
class Awesome << Awesomeness
end
SyntaxError: (irb):3: syntax error, unexpected tLSHFT, expecting '<' or ';' or '\n'