如何使用define_method定义?(超级)

时间:2014-01-19 23:56:21

标签: ruby metaprogramming

当我在传递给迭代器的块中使用define_method时,由于某种原因,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!

1 个答案:

答案 0 :(得分:1)

这是Ruby 1.9.3中的a bug,它在2.0.0-p0中修复但从未向后移植到1.9.3。报告的错误 完全相同,但its fix可能解决了这个问题。

可能这是因为defined?super都是关键字以及通过Proc在动态方法定义中确定范围的可能问题。但我只是在猜测。

你应该升级到Ruby 2.0(或更好的2.1)以便解决这个问题 - 或者尝试自己向后端移植补丁。