在此方法调用方的上下文中调用super

时间:2015-06-26 11:34:30

标签: ruby

我有几种方法具有相似的条件逻辑,我认为干它们是合理的。

class A
  def parent1(val)
    puts "parent1 A #{val}"
  end

  def parent2(val)
    puts "parent2 A #{val}"
  end
end

class B < A
  def parent1(val)
    if val
      puts "foo"
    else
      super
    end
  end

  def parent2(val)
    if val
      puts "bar"
    else
      super
    end
  end
end

是否可以创建一个#puts_or_super来调用其来电者的super? (B#parent1B#parent2)因此代码如下所示:

def parent1(val)
  puts_or_super(val, "foo")
end

def parent2(val)
  puts_or_super(val, "bar")
end

编辑:这有效,但看起来很疯狂

def puts_or_super(val, text)
  if val
    puts text
  else
    self.class.superclass.instance_method(caller[0][/`.*'/][1..-2].to_sym).bind(self).call
  end
end

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

假设您的定义在类A中,并且相关的超级方法在类B中定义,以便A继承自B

我认为你应该走另一条路。将B作为模块,并将B添加到A。然后,您拥有"foo""bar"等的定义将不是超级方法,条件将位于前置模块中。

module B
  def parent1(val)
    return super if val
    ... # your original logic in super class
  end
  def parent2(val)
    return super if val
    ... # your original logic in super class
  end
end

class A
  prepend B
  def parent1(_); puts "foo" end
  def parent2(_); puts "bar" end
end