是否可以在Ruby中定义带有可选参数的块?

Rea*_*nly 7 ruby

我正在尝试动态定义调用另一个带有options参数的函数的函数:

class MyClass
  ["hour", "minute", "second"].each do |interval|
    define_method "get_#{interval}" do |args|
      some_helper(interval, args)
    end
  end
  def some_helper(interval, options={})
    # Do something, with arguments
  end
end
Run Code Online (Sandbox Code Playgroud)

我希望能够以这两种方式在MyClass上调用不同的方法(使用和不使用可选参数):

mc = MyClass.new
mc.get_minute( :first_option => "foo", :second_option => "bar")
mc.get_minute  # This fails with: warning: multiple values for a block parameter (0 for 1)
Run Code Online (Sandbox Code Playgroud)

在第二次拨打分钟时,我看到了这个警告:

警告:块参数的多个值(0表示1)

  1. 有没有办法为"get_*"方法编写块,以便不会出现此警告?
  2. 我在滥用define_method吗?

Gor*_*son 16

您需要做的唯一更改是更改args*args.该*指示args将包含的可选参数的阵列,以该块.


knu*_*nut 5

两年后......我不知道是否是ruby 1.9.2的新功能,或者过去是否也可以使用,但这有效:

class MyClass
    ["hour", "minute", "second"].each do |interval|
        define_method "get_#{interval}" do |args = {:first_option => "default foo", :second_option => "default  bar"}|
           some_helper(interval, args)
        end
    end
    def some_helper(interval, options={})
        # Do something, with arguments
        p options
    end
end

mc = MyClass.new
mc.get_minute( :first_option => "foo", :second_option => "bar")
mc.get_minute  
Run Code Online (Sandbox Code Playgroud)

结果是:

{:first_option=>"foo", :second_option=>"bar"}
{:first_option=>"default foo", :second_option=>"default  bar"}
Run Code Online (Sandbox Code Playgroud)

  • 是的,带有默认值的可选参数是Ruby 1.9的新增功能 (2认同)