Ruby类继承:什么是<<`(小于两倍)?


74
class << Awesomeness

这是<<为了什么 我搜索了,但是结果只告诉我有关字符串连接的信息...

Answers:


135

class << something正如其他人说的那样,这确实是单例类的语法,但它最常用于在类定义中定义类方法。但是这两种用法是一致的。这是如何做。

Ruby允许您通过执行以下操作将方法添加到任何特定实例:

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

这将方法添加foo到某个实例,而不是其类,而是添加至该特定实例。(实际上,将foo添加到实例的“ singleton类”中,但这或多或少是一个实现怪癖。)执行以上代码后,可以将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
有趣!这样的方法在日常编程中有用吗?
Voldemort

6
@Omega:是的,例如,当您有多个要创建类方法的方法,而又不想用“ self”作为前缀时,会看到这种情况。您可以将它们全部放在该块中,而不必担心。
solidcell 2012年

很棒-这使我遇到的其他答案变得神秘。
拉里

最后一点使所有点击。还要注意,class << self即使它Thing是一个类,它也只是其超类的一个实例而已。因此,类与实例之间没有什么特别的。红宝石中的每个类都是其超类的实例(BasicObject除外)。
ahnbizcad 2014年

谢谢您的解释,解释得很好。
像素


20

如果要继承(基于问题标题),则需要一个<

class Awesome < ParentAwesomeness

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

class Awesomeness
end

class Awesome << Awesomeness
end

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

很高兴知道。搜索时很难找到该事实。
ahnbizcad 2014年

有趣的是,很少有人看过标题。其他的解释很好,但是却错过了询问者所要寻找的东西。
ObjectNameDisplay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.