class << Awesomeness
这是<<
为了什么 我搜索了,但是结果只告诉我有关字符串连接的信息...
Answers:
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关键字的用法,那么您将知道如何纠正它。
class << self
即使它Thing
是一个类,它也只是其超类的一个实例而已。因此,类与实例之间没有什么特别的。红宝石中的每个类都是其超类的实例(BasicObject除外)。
<<
是“ Singleton类定义”的语法。这是“通常”在何处/如何使用的示例。
在a = "abc"; a << "xyz"
它是语法“附加数据”(字符串,阵列等)
<<
中称为shovel operator
如果要继承(基于问题标题),则需要一个<
:
class Awesome < ParentAwesomeness
您提供的代码不是有效的ruby:
class Awesomeness
end
class Awesome << Awesomeness
end
SyntaxError: (irb):3: syntax error, unexpected tLSHFT, expecting '<' or ';' or '\n'