Подтвердить что ты не робот

Возможно ли иметь одну строку в каждом блоке в Ruby?

Существует ли однострочный метод записи этого блока в Ruby?

cats.each do |cat|
   cat.name
end

Я пытаюсь сократить количество кода в моем проекте. Я использую Ruby 1.9.2.

Спасибо!

4b9b3361

Ответ 1

Да, вы должны написать:

cats.each { |cat| cat.name }

Или просто:

cats.each(&:name)

Однако обратите внимание, что Enumerable#each возвращает тот же объект, который вы итерируете (здесь: cats), поэтому имеет смысл использовать его так, если вы выполняете какой-то побочный эффект для объектов внутри блок. Скорее всего, вы хотели получить имена кошек, поэтому вместо Enumerable # map:

cat_names = cats.map(&:name)

Ответ 2

Просто удалите разрывы строк:

cats.each do |cat| cat.name end

Обратите внимание, что есть два разных стиля кодирования, когда речь идет о блоках. В одном стиле кодирования всегда используется do/end для блоков, которые охватывают несколько строк и всегда используют {/} для однострочных блоков. Если вы следуете за этой школой, вам следует написать

cats.each {|cat| cat.name }

Другой стиль - всегда использовать do/end для блоков, которые в основном выполняются для их побочных эффектов и {/} для блоков, которые в основном выполняются для их возвращаемого значения. Поскольку each выбрасывает возвращаемое значение блока, имеет смысл передать блок для его побочных эффектов, поэтому, если вы будете следовать этой школе, вы должны записать ее с помощью do/end.

Но, как упоминает @tokland, более идиоматическим способом было бы написать

cats.each(&:name)

Ответ 3

Другим трюком, который я использую для rails console/irb, является разделение команд на ';' например.

[1,2].each do |e| ; puts e; end

Ответ 4

for cat in cats;cat.name;end

который тоже должен это сделать.