使用Ruby中的哈希值构造字符串

时间:2010-09-01 21:06:34

标签: ruby

假设我有哈希{ "a" => "b", "c" => "d" },我想将其转换为字符串"a=b\nc=d"

到目前为止我提出的解决方案是 { "a" => "b", "c" => "d" }.map { |k, v| k + "=" + v }.join("\n")
有更好/更优雅的方式吗?例如,是否可以使用单个方法调用来完成?

5 个答案:

答案 0 :(得分:5)

任何提议的解决方案都可行。请记住,在ruby 1.9.1之前,哈希是无序的。如果您需要保持元素的顺序,请记住先排序。

{ "a" => "b", "c" => "d" }.sort.map{|k, v| "#{k}=#{v}" }.join("\n")

答案 1 :(得分:4)

不是更好,但我认为这会有效:

{ "a" => "b", "c" => "d" }.map { |a| a.join '=' }.join("\n")

答案 2 :(得分:3)

你的方式非常好。我会做一个小改动。

{ "a" => "b", "c" => "d" }.map{|k,v| "#{k}=#{v}" }.join("\n")

答案 3 :(得分:2)

到目前为止所提出的解决方案对我来说都很好。这是一个“未受束缚的”:

{ "a" => "b", "c" => "d" }.inject(""){ |str, kv| str << "%s=%s\n" % kv }

答案 4 :(得分:0)

主题有两个额外的旋转:

str = ''
{ "a" => "b", "c" => "d" }.each_pair{ |n,v| str << "#{n}=#{v}\n" }
str # => "a=b\nc=d\n"

str = ''
{ "a" => "b", "c" => "d" }.each_pair{ |*e| str << e.join('=') << "\n" }
str # => "a=b\nc=d\n"

我在1.9.2上,所以哈希顺序保持不变,因为each_pair()会迭代它。

可以使用

Inject()而不是附加到str字符串的末尾,但是我的大脑总是必须降档一两秒来解码注入正在做的事情。我更喜欢追加,特别是在第二个例子中,因为它没有"#{}"线噪声。

如果你不想要尾随回车,那么@ba就有了我已经去过的地方,或者我所展示的快速str.chomp