ruby - 与继承一起使用时 `alias_method` 或 `alias` 关键字的意外行为

标签 ruby inheritance alias

当我尝试将 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

但问题是:为什么在第一种情况下它没有按预期工作?

继承是一种“糟糕的模式”,但例如,当在 Rails 中使用带有 DRY 的策略继承时,它可能很有值(value)

最佳答案

事实证明,alias_method 创建了一个引用原始方法而不是覆盖方法的别名。

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


注意:

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


注_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

关于ruby - 与继承一起使用时 `alias_method` 或 `alias` 关键字的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61734635/

相关文章:

ruby - 如何卡住 ruby​​-gnuplot 中的轴范围,并在卡住图的顶部绘制?

ruby-on-rails - 使用 ActiveAdmin 复制资源选项卡

c++ - 创建基类指针的 vector ,并将派生类对象传递给它(多态性)

C++ 使用来自另一个标识符下的头文件的包含类

c++动态维数组的别名指针

ruby - Rails 3 观察者和 current_user

arrays - 如何返回数组中第三大的数

java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?

javascript - John Resig 的 JavaScript 继承实现 : why `initializing` ?

c# - 将 'using alias = class' 与泛型一起使用?