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'