Ruby 如何使用defined?(super)和define_方法
当我从传递给迭代器的块中使用Ruby 如何使用defined?(super)和define_方法,ruby,metaprogramming,Ruby,Metaprogramming,当我从传递给迭代器的块中使用define\u方法时,由于某种原因defined?(super)的计算结果永远不会为true 请参见下面的示例。请注意,super(value)是一个有效的调用,即使defined?不这么认为 class A def message=(val) puts 'A says ' + val end end class B < A ['message', 'warning'].each do |method| define_method
define\u方法时,由于某种原因defined?(super)
的计算结果永远不会为true
请参见下面的示例。请注意,super(value)
是一个有效的调用,即使defined?
不这么认为
class A
def message=(val)
puts 'A says ' + val
end
end
class B < A
['message', 'warning'].each do |method|
define_method(method + '=') do |val|
puts 'B says ' + val
super(val) if defined?(super)
end
end
end
a = A.new
a.message = 'hello!' # A says hello!
b = B.new
b.message = 'hello!' # B says hello!
############################################
class B < A
['message', 'warning'].each do |method|
define_method(method + '=') do |val|
puts 'B says ' + val
super(val) rescue nil
end
end
end
b = B.new
b.message = 'hello!' # B says hello! A says hello!
A类
def消息=(val)
将“A”表示+val
结束
结束
B类
这是Ruby 1.9.3中的代码,它在2.0.0-p0中被修复,但从未向后移植到1.9.3。报告的错误并不完全相同,但很可能是解决了这个问题的原因
这可能是因为定义?
和超级
都是关键字,也是通过Proc在动态方法定义中确定范围的可能问题。但我只是在猜测
你应该升级到Ruby 2.0(或者更好的是2.1)来解决这个问题,或者自己尝试回接补丁。我不能复制这个,用你的前半个例子来说,当调用B\message
时,它调用A\message
。Ruby的哪个版本?Ruby 1.9.3p448(2013-06-27版本41675)[x86_64-darwin12.4.0]实际上,Ruby 2.1.0p0(2013-12-25版本44422)[x86_64-darwin12.0]
中似乎不存在这种行为。我无法在Ruby 2.0.0p353中重现,谢谢你的帮助!