【问题标题】:How to merge values of a single hash?如何合并单个哈希的值?
【发布时间】:2017-07-25 10:16:21
【问题描述】:

有没有办法合并单个哈希的值?

例子:

address = { 
    "apartment" => "1",
    "building" => "Lido House",
    "house_number" => "20",
    "street_name" => "Mount Park Road",
    "city" => "Greenfield",
    "county" => nil,
    "post_code" => "WD1 8DC"
}

我们能得到这样的结果吗?

1 Lido House,
20 Mount Park Road,
Greenfield,
WD1 8DC

address.compact 将删除等于 nil 的值,但如果在一个方法中包含字符串插值并且您想排除某些地址的 nil 值并包含在末尾没有逗号的其他地址,该怎么办?

def address(hash)
    hash.compact
    puts "#{hash["apartment"]} #{hash["building"]}, \n#{hash["house_number"]} #{hash["street_name"]}, \n#{hash["city"]}, \n#{hash["county"]}, \n#{hash["post_code"]}"
end

【问题讨论】:

  • 到目前为止你尝试过什么?一种可能的解决方案是遍历连接值字符串的哈希中的每个键。
  • 大家回答后,你改了问题!!总结一下:不,如果某些值是nil,ruby 没有“神奇”的方式来知道字符串应该如何格式化。这个逻辑需要你自己写,但不是很复杂。只需创建一个result 变量,并根据一些简单的条件附加到它。您对Hash#compact 的使用也是不必要的(甚至没有做任何事情!)。
  • 是的,我正在考虑删除问题并重新发布,但既然已经回答了,我想我会感谢那些做过的人。我做了类似于你建议的事情,除了我没有创建变量并附加到它。我仍在学习,并试图在提交之前找出回答问题的替代方法。科技界的理解发生了什么?!

标签: ruby hash


【解决方案1】:

您需要将值连接到一个字符串中:

"#{address['house_number']} #{address['street_name']},\n#{address['city']},\n#{address['post_code']}"

您还可以通过将此作为辅助方法并使用 HEREDOC 来改进格式:

def formatted_address(address)
  <<~ADDRESS
    #{address['house_number']} #{address['street_name']},
    #{address['city']},
    #{address['post_code']}
  ADDRESS
end

用法:

address = { 
  "house_number" => 20,
  "street_name" => "Mount Park Road",
  "city" => "Greenfield",
  "post_code" => "WD1 8DC"
}

puts formatted_address(address)
  # => 20 Mount Park Road,
  #    Greenfield,
  #    WD1 8DC

【讨论】:

    【解决方案2】:

    使用string formats

    "%{house_number} %{street_name},\n%{city},\n%{post_code}" % address
    

    【讨论】:

    • 请注意,这仅适用于您的哈希键是 Symbols。 OP 的问题使用 Strings 作为哈希键。如果这是在 Rails 项目中(即你有ActiveSupport),一个方便的方法是Hash#symbolize_keys
    • 你是对的。然而,在 Rails 中它会是一个HashWithIndifferentAccess,所以它可以工作吗?
    • 如果HashWithIndifferentAccess,那么是的,这也可以。 (哈希在 Rails 中“默认”没有无关紧要的访问。)在 OP 的实际代码示例中,您需要调用 address.with_indifferent_access 来实现这一点。
    • 这些哈希键应该是符号,IMO。正确的 Ruby 约定。
    猜你喜欢
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2016-09-02
    • 2012-01-14
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多