【问题标题】:Writing a better method with default options and a block in ruby使用默认选项和 ruby​​ 块编写更好的方法
【发布时间】:2017-10-25 10:26:50
【问题描述】:

我有一个 Ruby 中的方法(一个 Rails 助手),我想写得更好,这个方法需要很多选项作为哈希,如果这些选项不存在,它也有一些默认值。

目前看起来是这样的:

def some_html_helper(options = {}, &block)
    option1 = options.fetch(:option1, "default option1 value")
    option2 = options.fetch(:option2, "default option2 value")
    option3 = options.fetch(:option3, "default option3 value")
    option4 = options.fetch(:option4, "default option4 value")
    option5 = options.fetch(:option5, "default option5 value")
    option6 = options.fetch(:option6, "default option6 value")
    "return html with options used here and content... #{capture(&block)}"
  end

因此可以传入一个或不传入一个选项,其余的都有默认值,如下所示:

<%= some_html_helper option3: "not default value", do %>
  Some content...
<% end %>

有没有更好的方法来编写这样的方法?

【问题讨论】:

    标签: ruby-on-rails ruby arguments block


    【解决方案1】:

    使用带有默认值的关键字参数:

    def m(o1: 42, o2: :foo, o3: :bar, &block)
      puts [o1, o2, o3].inspect
    end
    
    m(o3: 3.14)
    #⇒ [42, :foo, 3.14]      
    

    或者。或者,使用双 splat:

    def m(**options, &block)
      options = {o1: 42, o2: :foo, o3: :bar}.merge options
      puts options.values.inspect
    end
    
    m(o3: 3.14)
    #⇒ [42, :foo, 3.14]      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多