Ruby:处理方法参数中的哈希值

时间:2014-10-15 01:09:39

标签: ruby hash each key-value params

我必须在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),它会让我\,{{1}字符串

中的},=>{

2 个答案:

答案 0 :(得分:1)

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

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

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

def tag(name, params)

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

答案 1 :(得分:0)

您可以考虑像这样写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">