Существует ли однострочный метод записи этого блока в Ruby?
cats.each do |cat|
cat.name
end
Я пытаюсь сократить количество кода в моем проекте. Я использую Ruby 1.9.2.
Спасибо!
Существует ли однострочный метод записи этого блока в Ruby?
cats.each do |cat|
cat.name
end
Я пытаюсь сократить количество кода в моем проекте. Я использую Ruby 1.9.2.
Спасибо!
Да, вы должны написать:
cats.each { |cat| cat.name }
Или просто:
cats.each(&:name)
Однако обратите внимание, что Enumerable#each
возвращает тот же объект, который вы итерируете (здесь: cats
), поэтому имеет смысл использовать его так, если вы выполняете какой-то побочный эффект для объектов внутри блок. Скорее всего, вы хотели получить имена кошек, поэтому вместо Enumerable # map:
cat_names = cats.map(&:name)
Просто удалите разрывы строк:
cats.each do |cat| cat.name end
Обратите внимание, что есть два разных стиля кодирования, когда речь идет о блоках. В одном стиле кодирования всегда используется do
/end
для блоков, которые охватывают несколько строк и всегда используют {
/}
для однострочных блоков. Если вы следуете за этой школой, вам следует написать
cats.each {|cat| cat.name }
Другой стиль - всегда использовать do
/end
для блоков, которые в основном выполняются для их побочных эффектов и {
/}
для блоков, которые в основном выполняются для их возвращаемого значения. Поскольку each
выбрасывает возвращаемое значение блока, имеет смысл передать блок для его побочных эффектов, поэтому, если вы будете следовать этой школе, вы должны записать ее с помощью do
/end
.
Но, как упоминает @tokland, более идиоматическим способом было бы написать
cats.each(&:name)
Другим трюком, который я использую для rails console/irb, является разделение команд на ';' например.
[1,2].each do |e| ; puts e; end
for cat in cats;cat.name;end
который тоже должен это сделать.