【问题标题】:Ruby: handling hashes in the parameters of a methodRuby:处理方法参数中的哈希
【发布时间】:2014-12-09 23:02:17
【问题描述】:

我必须在 Ruby 中编写一个tag 方法:

tag(:div, id: 'notification_panel', class: 'alert alert-danger')

它应该返回以下字符串(带有属性和值的 HTML 标记):

=> <div id="notification_panel" class="alert alert-danger">

这是我的标签方法:

def tag(name, *params)
    result = "<#{name} "
    params.each { |key, value| result << "#{key}=#\"#{value}\"  "  }
    result << " >"
end

但是 shell 会返回以下字符串:

=> "<div {:id=>\"notification_panel\", :class=>\"alert alert-danger\"}=#\"\"   >"

我不知道为什么它返回给我的是符号而不是符号的值(例如 id 而不是 :id)它让我 \=&gt;{、@987654331字符串中的@

【问题讨论】:

    标签: ruby hash each key-value params


    【解决方案1】:

    你可以考虑这样写tag()

    def tag(name, params)
      "<#{name} #{params.map { |k,v| "#{k}=\"#{v}\"" }.join(' ')}>"
    end
    
    puts tag(:div, id: 'notification_panel', class: 'alert alert-danger')
      #=> <div id="notification_panel" class="alert alert-danger">
    

    【讨论】:

      【解决方案2】:

      *params 将为您提供剩余参数的Array,其中将包含一个Hash。因此each 只会触发一次,keyHashvaluenil(因为Array#each 只将一个参数传递给它的yield)。然后#{key} 将在Hash 上调用to_s,给你{:id=&gt;"notification_panel", :class=&gt;"alert alert-danger"}

      **params 将为您提供剩余关键字参数的Hash,这是您想要的(在较新的 Ruby 中)。

      或者,在所有红宝石中,您可以这样做:

      def tag(name, params)
      

      在这种情况下应该做同样的事情,差不多。

      【讨论】:

      • 谢谢!我明白那个!所以,我尝试将*params 更改为**params,但 irb 向我抛出异常SyntaxError: (irb):11: syntax error, unexpected tPOW, expecting ')'
      • 那么你有一个旧的 Ruby,它还不支持关键字参数。使用另一种方法(仅使用params)。
      • 谢谢!我试过def tag(name, params),效果很好!!太棒了!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      相关资源
      最近更新 更多