gpt4 book ai didi

ruby - 如何使用 alias_method 打开类(class)

转载 作者:太空宇宙 更新时间:2023-11-03 17:14:45 24 4
gpt4 key购买 nike

我最近一直在阅读 Metaprogrammin Ruby 第 2 版,在第 5 章的末尾,他们提供了一个小测验

Your task is to change Fixnum class so that the answer to 1+1 becomes 3, instead of 2.

教科书上的解决方案我很容易理解(他们直接重新打开Fixnum类)。但我想尽可能多地尝试将方法隔离到一个独立的 Module 中。如下所示。

但是在下面运行会导致在新定义的 + 中无限循环。你能指出这段代码有什么问题吗?提前谢谢你。

module PlusOneMore
def self.prepended(base)
base.class_eval{
alias_method :original_plus, :+
}
end
def +(n)
original_plus(n).original_plus(1)
end
end

Fixnum.class_eval do
prepend PlusOneMore
end

puts 1.+(1)

最佳答案

问题是当执行 prepended Hook 时,您的覆盖已经发生。 IE。当您运行 alias_method :original_plus, :+ 时,+ 已经指向您的覆盖。

您需要确保新方法是在 alias_method 调用之后定义的,或者使用其他方法。

module Foo
def self.included(klass)
klass.class_eval do
alias_method :original_plus, :+
define_method(:+) do |n|
original_plus(n).original_plus(1)
end
end
end
end

Fixnum.include(Foo)

puts 1.+(1)
# => 3

您还可以将 prependsupersucc 一起使用:

module Foo
def +(n)
super(n.succ)
end
end

Fixnum.prepend(Foo)

puts 1.+(1)
# => 3

关于ruby - 如何使用 alias_method 打开类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35377832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com