2017-01-25 4 views
-1

私は文字列の中で配列を列挙しようとしており、配列の値を文字列の中に補間しようとしています。文字列の中で列挙する

例:

todos = ["sleep", "eat", "powernap"] 

"Today I have todo: \n" + 
'#{todos.each do |todo| }' 
"\t #{todo}" + 
'#{end}' 

OUTPUT:

"Today I have todo: \n\tsleep\neat\npowernap" 
+1

''今日私はtodo:\ n \ t#{todos。( "\ n")} " – Aguardientico

+0

これは完璧に機能しました。 –

答えて

3

あなたはERBの<%...%>あるいはPHPの<?phpのように動作するように#{...}を期待しているが、それはそうではないのです。文字列の補間には、構文的に有効な完全なRuby式が含まれていなければならず、そのコードは不完全です。

あなたは単数表現することを手直しすることができます。これはパフォーマンスの面で、多くの場合、次善のですが、

"Today I have todo: #{todos.join("\t "}" 

それとも、手動で繰り返しを行うことができますあなたのよう

todos.each_with_object("Today I have todo:") do |todo, buffer| 
    buffer << "\t " << todo 
end 

最初のバージョンがはるかに簡潔であることがわかります。

Rubyの文字列補間オプションは通常は柔軟性がありませんが、コードには自己完結型のコードが必要です。

0

私はあなたがこれをしたいと仮定します。

Today I have todo: 
     sleep 
     eat 
     powernap 

はあなたが単一の文字列に配列内の文字列をオンにする、その後、タブと改行の各要素をラップするjoinmapを使用できます。これを行うには。

todos.map {|todo| "\t#{todo}\n"}.join("") 

これは、各要素の周りに改行とタブを置き、各要素を連結します。文字列に変数を埋め込むには、#{}を使用して連結を使用していることに注意してください。それはまた"\t" + todo + "\n"だったかもしれません、まったく同じです。

結果は次のとおりです。

"\tsleep\n\teat\n\tpowernap\n" 

その後、あなたは文字列で、何も特別なことは必要ありませんことを連結することができます。

puts "Today I have todo:\n" + 
    todos.map {|todo| "\t#{todo}\n"}.join("") + 
    "I hope I get them done!\n" 

これを行う方法はたくさんありますが、重要なことは文字列を生成することです。それは配列を生成しますので、eachは動作しません、あなたはこのような何かを得るでしょう:

Today I have todo: 
    ["sleep", "eat", "powernap"] 
I hope I get them done! 

あなたは、あなたが文字列内#{}に式全体を置くことによって、文字列の補間としてこれを行うことができますしたい場合。リストをカンマ区切りの文字列に変換する簡単な例を示します。

puts "Today I have todo: #{todos.join(", ")}\n" 

任意の式は#{}に入ることができますが、#{}は、完全な表現が含まれている必要があります!各#{}は単独で実行され、各結果は文字列に連結されます。

関連する問題