首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby --如何模仿类方法的超类?

Ruby --如何模仿类方法的超类?
EN

Stack Overflow用户
提问于 2011-04-25 09:02:18
回答 1查看 376关注 0票数 0

出于(自动)教育目的,我试图模仿super的行为,以了解它是如何工作的。

我可以模仿实例方法的super,但不能模仿类方法。

下面是我的代码:

代码语言:javascript
复制
class A
  def aa
    @msg ||= 'Original...: '
    puts "#{@msg}#{self}.aa: #{self.class} < #{self.class.superclass}"
  end
  def self.ab
    @msg ||= 'Original...: '
    puts "#{@msg}#{self}.ab: #{self} < #{self.superclass}"
  end
end

class B < A
  def aa
    @msg = "Real super.: "
    super
  end
  def self.ab
    @msg = "Real super.: "
    super
  end
  def mimic_aa
    @msg = "Mimic super: "
    self.class.superclass.instance_method(:aa).bind(self).call
  end
  def self.mimic_ab
    @msg = "Mimic super: "
    #superclass.method(:ab).unbind.bind(self).call
      #=> Error: singleton method only works in original object

    #superclass.ab
      #=> self is A; I want self to be B

    proc = superclass.method(:ab).to_proc

    #self.instance_eval(&proc)
      #=> ArgumentError: instance_eval seems to call aa(some_unwanted_param)
      # Note: Ruby 1.8.7

    #eval('proc.call', binding)
      #=> self is A; I want self to be B

  end
end

a = A.new
b = B.new

a.aa         #=> Original...: #<A:0xb77c66ec>.aa: A < Object
b.aa         #=> Real super.: #<B:0xb77c6624>.aa: B < A
b.mimic_aa   #=> Mimic super: #<B:0xb77c6624>.aa: B < A

puts ''

A.ab         #=> Original...: A.ab: A < Object
B.ab         #=> Real super.: B.ab: B < A
B.mimic_ab   #=> (expected the same as above)

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-13 14:34:40

嗯,问题可能出在你使用的Ruby版本上。我运行的是1.9.2,程序按预期运行。我认为(根据代码中的注释)问题出在您运行的是Rubyv1.8.7。尝试再次运行代码也不会有什么坏处。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5774325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档