2017-01-25 4 views
-1

Я пытаюсь перечислить массив внутри строки и иметь значения интерполяции массива внутри строки.Перечислить внутри строки

Пример:

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

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

ВЫВОД:

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

'' Сегодня у меня есть todo: \ n \ t # {todos.join ("\ n")} "' – Aguardientico

+0

Спасибо, это сработало отлично, именно то, что мне было нужно. –

ответ

3

Вы ожидали #{...} работать как Эрба <%...%> или даже РНР <?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 

Для этого вы можете использовать map, чтобы обернуть каждый элемент в закладке и символ новой строки, а затем join превратить строки в массив в одну строку.

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" 

Любое выражение может перейти в #{}, но #{} должно содержать полное выражение! Каждый #{} будет запускаться сам по себе, и каждый результат будет конкатенирован в строку.

Смежные вопросы