Лично, я всегда находил термин "синтаксическим сахаром" неоднозначный. Я имею в виду, хотите ли Вы стать техническими, примерно что-нибудь кроме основной арифметики, если оператор и goto являются синтаксическим сахаром.
я думаю, что имеет в виду большинство людей, когда они отклоняют "синтаксический сахар", то, что функция языка делает, что-то усложнило чрезмерно простой. Самым известным примером этого является Perl. Но так как я не эксперт по Perl, я дам Вам пример того, о чем я говорю в Python (взятый от этот вопрос ):
reduce(list.__add__, map(lambda x: list(x), [mi.image_set.all() for mi in list_of_menuitems]))
Это - очевидная попытка создания чего-то более простого, которое уводят ужасно, ужасно неправильно.
Но это вовсе не значит я нахожусь на стороне удаления таких функций все же. Я думаю, что такие функции просто должны быть использованы тщательно.
Когда-то подход, который я выбрал для такого рода вещей, заключается в использовании интерполяции строк:
I will first #{link_to 'Link somewhere'}#{', then render this half of the sentence if a condition is met' if condition}
Мне не нравится внешний вид литеральной строки в интерполяции, но я использовал это с ранее объявленными строками или динамически сгенерированными ранее строками.
Хорошо, вот решение, на котором я остановился:
def one_line(&block)
haml_concat capture_haml(&block).gsub("\n", '').gsub('\\n', "\n")
end
I will first
- one_line do
= link_to 'link somewhere', 'http://example.com'
- if @condition
, then render this half of the sentence
\\n
if a condition is met
Таким образом, пробелы исключены по умолчанию, но я все равно могу явно включить его с помощью Строка "\ n". (Ему нужна двойная обратная косая черта, потому что в противном случае HAML интерпретирует его как фактический перевод строки.) Дайте мне знать, если есть лучший вариант!
Есть синтаксис угловой скобки «пережевывание пробелов», в противном случае напишите для него вспомогательный метод.
Вы также можете сделать это, используя модификатор Haml «обрезать пробелы». Вставка >
после объявления Haml предотвратит добавление пробелов вокруг него:
I will first
%a{:href => 'http://example.com'}> link somewhere
- if @condition
, then render this half of the sentence if a condition is met
производит:
I will first<a href='http://example.com'>link somewhere</a>, then render this half of the sentence if a condition is met
Однако, как вы можете видеть, модификатор >
также удаляет пробелы в перед ссылкой, удалив желаемый пробел между словами и ссылкой. Я еще не придумал хороших способов обойти это, кроме добавления & nbsp;
в конец «Я сделаю первым», например:
I will first
%a{:href => 'http://example.com'}> link somewhere
- if @condition
, then render this half of the sentence if a condition is met
Что, наконец, дает желаемый результат без большого количества трудностей. интерполяция для чтения:
I will first <span><a href="http://example.com">link somewhere</a></span>, then render this half of the sentence if a condition is met
Вы можете сделать это, чтобы сохранить начальный пробел:
%a{:href => 'http://example.com'}>= ' link somewhere'
Пробел заключен в кавычки.
Хотя это плохо документировано, это достигается с помощью сохранения пробелов HAML (>) в сочетании с пробелом ASCII (& # 32;), а не с помощниками:
%a{:href=>'/home'}> Home link
, 
%a{:href=>'/page'} Next link
Это даст то, что вы хотите:
<a href='/home'>Anchor text</a>, 
<a href='/page'>More text</a>
Но Я согласен, HAML необходимо придумать лучший способ сделать это, поскольку он добавляет на страницу ненужные символы ASCII (но все же более эффективен, чем использование помощников).