在 Ruby 中定义元编程的方法参数

2024-05-02

在 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!"

我们还可以将参数注入到动态方法中:

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

到目前为止,一切都很好。

但是我们该怎么做才能注入动态论证? 是否可以更换arg1, arg2, &block通过动态符号?

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

Edit:

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

但是,我想使用特定数量的参数(可能是 0)、选项中的数组来完成此操作,并完成该方法的块。

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

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"

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

Edit 2:

原因如下:

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

def my_method
  "Hello, SO world!"
end

但是,如果我这样做:

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

...结果还是一样,但是因为参数(数组args) 是无用的,最好通过将其从方法中删除来保持简单。


尝试传递数组或字典。

UPDATE:

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

UPDATE2:

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

UPDATE3:

# 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Ruby 中定义元编程的方法参数 的相关文章

随机推荐