【问题标题】:Creating a Ruby hash with key:value lines使用 key:value 行创建 Ruby 哈希
【发布时间】:2012-07-19 04:17:59
【问题描述】:

这是另一个“在 Ruby 中执行 X 的最优雅方法是什么”类型的问题。考虑来自 web 服务的响应,在返回主体的每一行上都有键:值对,沿

key1:val1
key2:val2
key3:val3

我想用这个数据创建一个 Ruby 哈希,{"key1" => "val1", ...}。从算法上讲,我可以用 git 'er 完成

hash = {}
body.lines.each do |line|
  key, val = line.split(':')
  hash[key] = val
end

但我猜有一个更优雅的单衬或双衬。

【问题讨论】:

标签: ruby parsing hashtable


【解决方案1】:

这是我的建议:

lines = [
  'key1:val1',
  'key2:val2',
  'key3:val3'
]

hash = Hash[lines.map {|it| it.split(':', 2)}]

说明

Hash[object] 从对象创建一个新的散列。其中对象是以下之一:

  • 元素列表
  • 对列表
  • 可以转换为哈希的对象

【讨论】:

  • 这就像一个魅力,Hash[] 语法的解释是什么?我对此并不熟悉。
  • it 不是一个特别有意义的名字,为什么不简单的line?另请注意,split(':', 2) 允许在值中使用冒号。
  • 不知道我是从哪里养成这个习惯的。可能来自groovy。对我来说,它代表它 :) 或迭代器。
  • 所以我收集了,但在 Ruby 世界中,iterator 的概念并不存在 :-) 只是一个细节,根据我的经验,给变量赋予有意义的名称很有帮助。
  • @tokland 我同意你的观点,正确的命名对于可维护的代码至关重要。我只是认为具有一行范围的变量可以具有更短的名称而不会影响可读性。
【解决方案2】:

如果你有一对对象,那么Hash[] 就是你的朋友:

Hash[lines.map {|key_val| key_val.split(":")}]
=> {"key1"=>"val1", "key2"=>"val2", "key3"=>"val3"} 

该死的,太慢了……

【讨论】:

    【解决方案3】:

    帖子中有插入符号返回,所以真正的主题解决方案是

    hash = Hash[lines.split(/\s/).map {|line| line.split(':', 2)}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 2020-07-02
      • 2012-11-23
      • 2014-12-06
      • 1970-01-01
      相关资源
      最近更新 更多