Ruby类问题[重复]
Posted
技术标签:
【中文标题】Ruby类问题[重复]【英文标题】:Ruby class question [duplicate] 【发布时间】:2011-03-21 21:25:37 【问题描述】:可能重复:class << self idiom in Ruby
我有一个简短的 Ruby 问题。我来自 Java/c 背景,所以当在实例方法中引用时,我理解 Ruby 中的“self”就像“this”。还有“自己”。方法前缀将其定义为类方法。
但这在这里意味着什么??
class << self
def some_method
end
end
【问题讨论】:
【参考方案1】:这里发生的事情是,我们从自身内部重新打开一个对象的类,并在其上定义一个新的实例方法。这是在 Ruby 中进行所谓的“猴子修补”的方法之一。该方法只将该方法添加到当前对象,而不是该类的所有对象。
相当于这样做:
my_obj = MyClass.new
class << my_obj
def some_method
end
end
# or...
def my_obj.some_method
end
这是一篇很好的文章:Learning Ruby: class << self。
【讨论】:
OscarRyz:调用代码的实例。 我认为这个答案应该更明确地谈论单例类或特征类。 “从内部重新打开一个对象的类”太模糊了,使用的“类”这个词并不能清楚地表明该类是单例类,而不仅仅是通过obj.class
返回的类【参考方案2】:
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 时)。
【讨论】:
【参考方案3】:这是您为对象的单例/特征类定义方法的方式。
class << foo
def bar
end
end
等价于
def foo.bar
end
【讨论】:
【参考方案4】:如果你这样使用它:
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
我真的不喜欢这种符号。
【讨论】:
不是 self.* 类方法,但看到上面的其他解释似乎“类 这根本不是“速记”。如果有的话,您的后一种语法是前者的一种简写。class << self
打开对象的 eigenclass,不仅可以用于定义方法。
如果您要添加大量类变量,这只是简写。我把这个观察作为练习留给读者,我想他们会认为这不是他们应该做的事情,除非他们有一个该死的充分理由。他们没有。 =]以上是关于Ruby类问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章