使用继承时 `alias_method` 或 `alias` 关键字的意外行为

Unexpected behavior of the `alias_method` or `alias` keyword when usage with an inheritance

我在尝试将 alias_method 与继承一起使用时遇到了这种有线行为:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end
  alias_method :value, :result
end

class Third < Second
  def result
    'Third:result'
  end
end

Third.new.calculate
# => Second:result

所以,我们可以这样解决:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end

  def value
    result
  end
end

class Third < Second
  def result
    'Third:result'
  end
end

Third.new.calculate
# => Third:result

或者这样:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end
  alias_method :value, :result
end

class Third < Second
  def result
    'Third:result'
  end
  alias_method :value, :result
end

Third.new.calculate
# => Third:result

但问题是:为什么在第一种情况下它没有像 预期的那样工作

继承是一种 "bad pattern",但在 Rails 中使用带有 DRY 的策略继承时它可能很有价值,例如

Turns out that alias_method creates an alias that references the original method rather than the overwritten one.

具有更多详细信息的来源:https://theinternate.com/2014/02/14/inheritable-aliases-in-ruby.html


注:

我很困惑,所以我决定分享它,我希望它对某些人有帮助,避免可能的混淆。


note_2:

alias关键字相同:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end
  alias value result
end

class Third < Second
  def result
    'Third:result'
  end
end

Third.new.calculate
# => Second:result

可以用同样的方法解决:

class First
  def calculate
    puts value
  end
end

class Second < First
  def result
    'Second:result'
  end
  alias value result
end

class Third < Second
  def result
    'Third:result'
  end
  alias value result
end

Third.new.calculate
# => Third:result