【发布时间】:2011-09-16 15:00:11
【问题描述】:
我有两个问题:
- 方法
f_1是否属于元类匿名类? - 方法
f_2是否属于匿名类?
相关代码如下:
car = "car"
class << car
def self.f_1
puts "f_1"
end
def f_2
puts "f_2"
end
end
【问题讨论】:
标签: ruby eigenclass
我有两个问题:
f_1是否属于元类匿名类?f_2是否属于匿名类?相关代码如下:
car = "car"
class << car
def self.f_1
puts "f_1"
end
def f_2
puts "f_2"
end
end
【问题讨论】:
标签: ruby eigenclass
由于 ruby 自己的 API 使用术语“singleton class”,我会说以下是正确的:
f_1是汽车单例类的类方法,可以这样调用:
car.singleton_class.f_1
f_2是汽车单例类的实例方法,可以这样调用:
car.f_2
【讨论】:
好吧,术语是易碎的,但 FWIW 我会说你的班级并不是真正的匿名班级。至于归属,这两种方法都只存在于汽车对象中。
老实说,当针对这样的单个对象定义类时,我对类方法和实例方法之间的区别有点模糊——我猜如果有任何区别,这将是一个晦涩难懂的代码,会使您的代码更难阅读;)
更新:如果您以前从未见过this,您可能会发现它很有帮助。 (就个人而言,这让我很头疼,但每个人都不一样......)
【讨论】:
我的印象是匿名类是没有名字的类:
my_class = Class.new
my_class.name # => nil
但是,Pickaxe 将其称为未命名类而不是匿名类。
【讨论】:
Rob Davis 的回答重新表述:
:f_1 的方法所有者是 car.singleton_class.singleton_class。:f_2 的方法所有者是car.singleton_class。链car → car.singleton_class → car.singleton_class.singleton_class 对应于图表中的底行http://www.atalon.cz/rb-om/ruby-object-model/#sc-inheritance-sample。
注意事项:
【讨论】: