Сравнение с ruby не имеет смысла, потому что эликсир является неизменным, функциональным языком, и по дизайну все в Elixir возвращает что-то , так как выне может изменить состояние.Это включает понимания подобно for
, которые возвращают список новых рассчитанных значений.В качестве простого примера посмотрите, что возвращает базовое понимание:
for user <- @users, do: full_name(user)
# => ["John Case", "Mak Ali", "Sarah Middleton"]
Во-вторых, EEx
допускает два способа выполнения кода в шаблонах:
<% %>
, который выполняетоператоры, но отбрасывает результат и <%= %>
, который выполняет операторы, а вводит результат в шаблон
Но мы уже используем <%= %>
для дочерних элементов в понимании, , поэтому они все еще должны быть внедрены в шаблон, верно?
Нет.На данный момент они все еще находятся внутри блока for
, поэтому, даже если вычисляются дочерние элементы с полным именем, они не отображаются, потому что результат самого понимания не включен .
Лучшим сравнением в rails были бы помощники формы .Если вы не используете <%= >
для основного тега form
, вся форма не будет обработана, даже если вы используете ее для дочерних тегов.Это связано с тем, что дочерние элементы находятся внутри него и могут отображаться только при отображении самой формы.
Механизм EEx
позднее объединяет все элементы списка в шаблон.Вы можете попробовать это сами:
EEx.eval_string("Numbers: <%= list %>", list: ~w[1 2 3])
#=> "Numbers: 123"
EEx.eval_string("Numbers: <%= for i <- list do %> <b><%= i %></b> <% end %>", list: ~w[1 2 3])
#=> "Numbers: <b>1</b> <b>2</b> <b>3</b> "
EEx.eval_string("Numbers: <% for i <- list do %> <b><%= i %></b> <% end %>", list: ~w[1 2 3])
#=> "Numbers: "