当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否可以在Ruby中定义带有可选参数的块?》经验,为你挑选了2个好方法。

我正在尝试动态定义调用另一个带有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

我希望能够以这两种方式在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)

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

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

    有没有办法为"get_*"方法编写块,以便不会出现此警告?

    我在滥用define_method吗?

Gordon Wilso.. 16

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



1> Gordon Wilso..:

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



2> knut..:

两年后......我不知道是否是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  

结果是:

{:first_option=>"foo", :second_option=>"bar"}
{:first_option=>"default foo", :second_option=>"default  bar"}


是的,带有默认值的可选参数是Ruby 1.9的新增功能
推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有