gpt4 book ai didi

ruby - 如何使用 Ruby mixins 作为类的补丁

转载 作者:数据小太阳 更新时间:2023-10-29 07:50:43 26 4
gpt4 key购买 nike

我开始研究 Ruby,因为我正在寻找一种比 Java 更动态的替代方案。我喜欢在 Ruby 中如何在类定义之后对其进行修改,例如:

class A
def print
"A"
end
end

class B < A
def print
super + "B"
end
end

class A
alias_method :print_orig, :print
def print
print_orig + "+"
end
end

puts B.new.print # A+B

现在我尝试对 mixins 做同样的事情:

class A
def print
"A"
end
end

class B < A
def print
super + "B"
end
end

module Plus
alias_method :print_orig, :print
def print
print_orig + "+"
end
end

A.extend(Plus) # variant 1
B.extend(Plus) # variant 2
class A # variant 3
include Plus
end
class B # variant 4
include Plus
end
puts B.new.print

然而,没有一个变体产生预期的结果。顺便说一句,预期结果如下:我希望能够使用 mixin 来“修补”A 类,以修改其行为。我想使用 mixins,因为我想用相同的行为“修补”几个类。

是否可以做我想做的事?如果是,如何?

最佳答案

您的模块代码不起作用,因为它是在错误的上下文中执行的。您需要在 A 的上下文中执行它,但它是在 Plus 的上下文中评估的。这意味着,您需要将 selfPlus 更改为 A

观察:

class A
def print
"A"
end
end

class B < A
def print
super + "B"
end
end

module Plus
self # => Plus
def self.included base
self # => Plus
base # => A
base.class_eval do
self # => A
alias_method :print_orig, :print
def print
print_orig + "+"
end
end
end
end

A.send :include, Plus
B.new.print # => "A+B"

关于ruby - 如何使用 Ruby mixins 作为类的补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10136315/

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