2010-09-01 24 views
2

假設我有散列{ "a" => "b", "c" => "d" },並且我想將其轉換爲字符串"a=b\nc=d"使用Ruby中的散列值構造字符串

我想出迄今的解決方案是
{ "a" => "b", "c" => "d" }.map { |k, v| k + "=" + v }.join("\n")
是否有更好/更優雅的方式?例如,它可以使用單個方法調用完成嗎?

+5

在單一方法調用中做某些事情並不一定意味着它會更好或更優雅。你的解決方案看起來非常合理,壓縮它甚至不會增加可讀性。 – 2010-09-01 21:37:11

回答

2

到目前爲止,所有迄今爲止提出的解決方案對我來說都很不錯。下面是一個「奔放」之一:

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

我會接受這個答案,因爲我特別好奇注射類似的東西。這正是我想弄明白的。 但是,我同意Adam Byrtek的簡潔和高雅並不總是相關的,AboutRuby的解決方案更具可讀性,更適合實際的代碼。 – Ray 2010-09-02 13:42:50

4

也好不到哪去,但我認爲這會工作:

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

你的方式是相當不錯的。儘管我會做一些小改變。

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

任何建議的解決方案都可以使用。請記住,在ruby 1.9.1之前的哈希是無序的。如果您需要保留元素的順序,請記得先將其排序。

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

就我而言,順序並不重要,但這仍然很好。謝謝! – Ray 2010-09-02 13:44:04

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