Ruby类继承:什么是`<<`(double less than)?

时间:2011-05-31 03:06:28

标签: ruby

class << Awesomeness

这是<<的内容是什么?我搜索了,但结果只告诉我字符串连接......

3 个答案:

答案 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'