gpt4 book ai didi

ruby - 在 Ruby 中为元编程定义方法参数

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

在 Ruby 中,我们可以使用元编程定义实例方法,例如:

define_method(:hi) { 'Hello, SO world!' } # => :hi
hi # => "Hello, SO world!"

这样,就可以定义一个具有动态名称的方法:

dynamic_name = :hi                                 # => :hi
define_method(dynamic_name) { 'Hello, SO world!' } # => :hi
hi # => "Hello, SO world!"

我们还可以将参数注入(inject)动态方法:

dynamic_name = :hi # => :hi
define_method(dynamic_name) do |arg1, arg2, &block|
'Hello, SO world!'
end # => :hi
hi(42, 42) { 42 } # => "Hello, SO world!"

到目前为止,还不错。

但是我们如何才能注入(inject)动态参数呢?是否可以用动态符号替换 arg1, arg2, &block

感谢您提供任何提示、最佳实践甚至想法。

编辑:

换句话说,我也想动态定义实例方法的参数和 block 。

但是,我想使用特定数量的参数(可能为 0)、一个可选的数组来完成此方法的 block 。

这样,我就可以避免使用如下方法:

dynamic_name = :hi      # => :hi
define_method(dynamic_name) do |*args, &block|
'f'
end # => :hi
hi # => "f"
hi(:foo) # => "f"
hi(:foo, :fooo) # => "f"
hi(:foo, :fooo, :foooo) # => "f"

...这是无稽之谈,因为在这里我们可以为方法提供无限数量的未使用参数。我想避免这种情况。

编辑 2:

原因如下:

在Ruby中,当我们需要一个不需要任何参数的方法时,我们可以简单地做:

def my_method
"Hello, SO world!"
end

但是,如果我这样做:

def my_method(*args)
"Hello, SO world!"
end

...结果还是一样,但是因为参数(数组 args)没用,最好将它从方法中移除以保持简单。

最佳答案

尝试传递数组或字典。

更新:

if condition1
class_eval <<-EVAL
def #{"my_method"}(arg1)
end
EVAL
else
class_eval <<-EVAL
def #{"my_method"}
end
EVAL
end

更新 2:

if condition1
self.instance_eval <<-EVAL
def #{"my_method"}(arg1)
end
EVAL
else
self.instance_eval <<-EVAL
def #{"my_method"}
end
EVAL
end

更新 3:

# or
self.instance_eval("def method1(arg1) puts 'hellowa' + arg1.to_s; end")
self.instance_eval("def method2() puts 'hellowa2'; end")

# and then
method1(33) # => hellowa33
method2 # => hellowa2

关于ruby - 在 Ruby 中为元编程定义方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33425935/

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