Можно ли поместить условный оператор в здесь документ? - PullRequest
2 голосов
/ 10 ноября 2011

Я знаю, что мы можем делать такие вещи:

puts <<START
----Some documents
#{if true
"yesyesyesyesyesyesyesyesyesyes"
else
"nonononononononononononononono"
end}
----Some documents
START

Но возможно ли это сделать так:

puts <<START
----Some documents
#{if true}
yesyesyesyesyesyesyesyesyesyes
#{else}
nonononononononononononononono
#{end}
----Some documents
START

Почему я хочу этого, потому что я ненавижу одинарные / двойные кавычки в этом документе, если их избегать, документ станет более понятным

Кто-нибудь может помочь?

спасибо!

Ответы [ 4 ]

3 голосов
/ 10 ноября 2011

Может быть, вы на самом деле хотите использовать ERB, если намерение состоит в выполнении шаблонов.ERB будет поддерживать разбиение штрафов if / else:

require 'erb'

template = ERB.new <<-DOC
----Some documents
<% if true %>
yesyesyesyesyesyesyesyesyesyes
<% else %>
nonononononononononononononono
<% end %>
----Some documents
DOC

string = template.result(binding)
2 голосов
/ 10 ноября 2011

Я дам альтернативу, которую я предпочел бы, которая заключается в использовании heredoc, назначенных переменным, которые затем вставляются в основной heredoc, так как он получает условное выражение вне heredoc, таким образом, обеспечивая лучшую ясность, которую вы ищете (особенно, когда все становится сложнее, чем надуманный пример):

cond = if true
<<TRUE
yesyesyesyesyesyesyesyesyesyes
TRUE
else
<<NOTTRUE
nonononononononononononononono
NOTTRUE
end.strip

puts <<START
----Some documents
#{cond}
----Some documents
START

Если вы ищете шаблон, то есть много, и, на мой взгляд, гораздо лучше, чем ERB (начните с рассмотрения Haml).

1 голос
/ 10 ноября 2011

Вы можете рассмотреть вложенные heredocs:

puts <<EOF
---- Some documents
#{if true; <<WHENTRUE
yesyesyes
WHENTRUE
else <<WHENFALSE
nonono
WHENFALSE
end
}---- Some documents
EOF

Обратите внимание, что вам нужно поместить закрывающий } в начале строки, иначе у вас будет лишняя пустая строка.

Редактировать: Вы можете избежать этого и, возможно, получить более приятный синтаксис, используя небольшую вспомогательную функцию:

def if_text(condition, whentrue, whenfalse)
  (condition ? whentrue : whenfalse).chomp
end

puts <<EOF
---- Some documents
#{if_text(true, <<ELSE, <<ENDIF)
yesyesyes
ELSE
nonono
ENDIF
}
---- Some documents
EOF
1 голос
/ 10 ноября 2011

Вы можете использовать ERB, если вы действительно хотите что-то подобное:

str = <<-ERB
----Some documents
<% if true %>
yesyesyesyesyesyesyesyesyesyes
<% else %>
nonononononononononononononono
<% end %>
----Some documents
ERB
erb = ERB.new(str, nil, '<>');
puts erb.result(binding)
...