ERB печатает строку ввода в конце цикла each_line - PullRequest
3 голосов
/ 14 декабря 2011

Это совсем смутило меня на некоторое время. Я получаю странное поведение, пытаясь перебрать строки текста в erb, когда вся строка текста печатается после завершения цикла.

<% "some\nmultiline\ntext".each_line do |line| %>
  <%= line %> <br />
<% end %>

Выходы:

some 
multiline 
text 
some multiline text

И так же:

<% "some\nmultiline\ntext".lines.each do |line| %>
  <%= line %> <br />
<% end %>

Но следующее работает так, как я ожидал:

<% "some\nmultiline\ntext".lines.to_a.each do |line| %>
  <%= line %> <br />
<% end %>

и отпечатки:

some 
multiline 
text 

Я определенно не просто случайно вставил =. Что может быть причиной этого странного поведения?

Я использую Rails 3.0.10, Ruby 1.9.2.

1 Ответ

0 голосов
/ 14 декабря 2011

Не могу точно сказать, но "some\nmultiline\ntext".lines - это Enumerator, а "some\nmultiline\ntext".lines.to_a - это Enumerable, большая разница в том, что когда вы смешиваете модуль Enumerable со своим классом, вы должны определить метод each чья это работа выводить элементы в поставляемый блок кода, по одному за раз. Перечислители являются недавним и значительным дополнением к Ruby. Перечислитель - это объект, а не метод. Перечислитель не является контейнерным объектом. У него нет «естественного» основания для каждой операции, как у массива (начиная с элемента 0; выдайте его; перейдите к элементу 1; приведите его и т. Д.). Каждая логика итерации каждого перечислителя должна быть указана явно.

...