我有一个快速的 Ruby 问题。我来自 Java/c 背景,所以当在实例方法中引用时,我理解 Ruby 中的“self”就像“this”。还有“自己”。方法的前缀将其定义为类方法。
但这意味着什么?
class << self
def some_method
end
end
我有一个快速的 Ruby 问题。我来自 Java/c 背景,所以当在实例方法中引用时,我理解 Ruby 中的“self”就像“this”。还有“自己”。方法的前缀将其定义为类方法。
但这意味着什么?
class << self
def some_method
end
end
这里发生的事情是,我们正在从自身内部重新打开一个对象的类并在其上定义一个新的实例方法。这是在 Ruby 中进行所谓的“猴子修补”的方法之一。此方法仅将方法添加到当前对象而不是类的所有对象。
这相当于这样做:
my_obj = MyClass.new
class << my_obj
def some_method
end
end
# or...
def my_obj.some_method
end
这是一篇很好的文章:Learning Ruby: class << self。
语法class << some_objct
打开了some_object
的单例类,这是一个特殊的“秘密”类,只有该对象属于。使用单例类,您可以定义一个对象响应而其普通类的其他实例不响应的方法。
因此,例如:
a = "Hello world"
b = "Hello world" # Note that this is a different String object
class << a
def first_letter
self[0,1]
end
end
puts a.first_letter # prints "H"
puts b.first_letter # Raises an error because b doesn't have that method
在类上下文中,这两个方法定义是等价的:
class Foo
def self.bar
puts "Yo dawg"
end
end
class Foo
class << self
def bar
puts "Yo dawg"
end
end
end
第二种形式在某些情况下可能很有用(例如,当您想attr_accessor
为类对象本身声明 s 时)。
这是您为对象的单例/特征类定义方法的方式。
class << foo
def bar
end
end
相当于
def foo.bar
end
如果你像这样使用它:
class Foo
class << self
def something
puts "something"
end
def something_else
puts "something else"
end
end
end
Foo.something
它是以下的简写:
class Foo
def self.something
puts "something"
end
def self.something_else
puts "something else"
end
end
我不喜欢这种符号,真的。