gpt4 book ai didi

ruby - 在 Ruby 中动态定义方法时如何处理参数和 block ?

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

下面是一个类的代码,它可以动态地将日志记录添加到方法中。这适用于方法不接受任何参数且不接受任何 block 的情况。

如何重写代码,以便我可以添加方法的日志记录,即使它接受参数并接受 block ?

class X
def greet
puts "hi"
end

def self.add_logging(method_name)
alias_method("original_#{method_name}".to_sym, method_name)

#How do i rewrie this to account for method_name's arguments and ability to accept a block?
define_method(method_name) do
puts "calling #{method_name}"
send "original_#{method_name}".to_sym
puts "done #{method_name}"
end
end
end

x = X.new
x.greet
X.add_logging(:greet)
x.greet

输出

>hi 
>calling greet
>hi
>done greet

最佳答案

class X
def self.add_logging method
alias_method "original_#{method}", method
define_method(method) do |*args, &pr|
puts "calling #{method}"
send "original_#{method}", *args, &pr
puts "done #{method}"
end
end
def greet person
puts "hi #{person}"
end
end

x = X.new
x.greet("Joe")
X.add_logging(:greet)
x.greet("Jane")

将给予:

hi Joe
calling greet
hi Jane
done greet

关于ruby - 在 Ruby 中动态定义方法时如何处理参数和 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512506/

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