gpt4 book ai didi

ruby 类扩展

转载 作者:数据小太阳 更新时间:2023-10-29 08:42:06 25 4
gpt4 key购买 nike

我想用 ruby​​ 编写一个方法,它接受一个具有特定方法的类,并通过添加方法或更改现有方法的工作方式来修改其行为。我想以不修改基类的方式执行此操作,所以基本上我想要一个函数,它接受一个类并返回一个新的修改后的类,而不会损害初始类。我很确定这是可能的,但我不确定从哪里开始。

最佳答案

你有几个选择:

  • 你可以使用 x = Class.new(Parent) { def meth;放“你好”;极好的;说“再见”; end 动态定义一个类并覆盖方法(并定义新方法)
  • 您可以使用Delegator

例如,如果您想动态创建记录特定方法调用的类:

class Class
def logging_subclass(*methods)
Class.new(self) do
methods.each do |method|
define_method(method) do |*args,&blk|
puts "calling #{method}"
ret = super(*args,&blk)
puts "#{method} returned #{ret.inspect}"
ret
end
end
end
end
end

class One
def foo
"I'm foo!"
end
end

# this prints nothing
One.new.foo #=> returns :foo

# this prints:
# > calling foo
# > foo returned "I'm foo!"
One.logging_subclass(:foo).new.foo #=> returns :foo

请注意,您需要 ruby​​ 1.9 来支持捕获 do |&blk|(捕获 block 参数中的 block )。

关于 ruby 类扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1350205/

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