【发布时间】:2013-01-28 03:15:58
【问题描述】:
我正在阅读这本书“The Well-Grounded Rubyist”,我突然想到了这个随机问题。我知道在 Ruby 中可以重新打开一个类并覆盖该方法。
例子:
class A
def x
"First definition of x"
end
def x
"Second definition of x"
end
end
test = A.new
test.x #returns "Second definition of x"
根据上面的结果,我很好奇是否可以用我自己的(随机)定义覆盖类方法attr_accessor。这是我的想法:
class Dummy
attr_accessor :test
def self.attr_accessor(method_name)
puts "Overwrite the default functionality of attr_accessor by printing this text instead."
end
end
d = Dummy.new
d.test #not sure why this returns nil instead of putting my message
Dummy.attr_accessor(test) #fails because of ArgumentError: wrong number of arguments (0 for 2..3)
对于上面的两个示例,我希望通过修补和提问来获得您的洞察力,从而更好地理解 Ruby。
【问题讨论】:
-
“重新打开一个方法并覆盖该方法是可能的”...呃...重新打开一个类并覆盖一个方法是可能的。
-
抱歉术语混淆了;你是对的 - 我的意思是在一个类中可以有多个方法定义。谢谢!
-
没关系。我只是在检查以确保您理解其中的区别。术语更正很重要,以免不了解差异的人阅读并得到错误的想法。现在,如果您覆盖旧定义会发生什么,然后调用使用该方法的代码,也许是您需要的其他一些 gem,它调用
attr_accessor,期望它创建一个实例变量的 getter/setter 例程,而那些不由于您的覆盖而无法构建?这就是为什么我们非常小心覆盖核心例程的原因。只是想一想。
标签: ruby