Возвращает ли значение из 'next' плохую идею? - PullRequest
10 голосов
/ 05 марта 2012

Должно быть легко.После прочтения этого поста в блоге я подумал, что мог бы вернуть что-то сразу после моей next команды:

next "new value" if axis_range == "test"

Что я действительно хотел бы сделатьэто лог причина следующего в этой же строке:

next @logger.info('skipping this item because for fun') unless (elephants.size > 0)

Я не могу найти обсуждение этого использования next на ruby ​​doc ,Код, безусловно, работает.Я понимаю, что могу сделать это с помощью блока unless, но эта строка кода ооочень лаконична.

Два вопроса:

  • Где-нибудь есть лучший документ?
  • Является ли это использование next немного странным, а не 'ruby-ish'?

Ответы [ 3 ]

19 голосов
/ 05 марта 2012

"Как и ключевые слова return и break, next может использоваться отдельно или за ним может следовать выражение или разделенный запятыми список выражения. Когда next используется в цикле, любые значения следующие next игнорируются. В блоке однако выражение или выражения стать "возвращаемым значением" оператора yield, который вызвал блок ". (Язык программирования Ruby, Дэвид Фланаган и Юкихиро Мацумото, 2008 г., стр. 150)

Книга приводит такой пример:

squareroots = data.collect do |x|
  next 0 if x < 0 # return 0 for negative values
  Math.sqrt(x)
end

и эта альтернатива:

squareroots = data.collect do |x|
  if (x < 0) then 0 else Math.sqrt(x) end
end 
0 голосов
/ 05 марта 2012

По сути, у меня не было бы проблемы с ним, если бы он не был прямо посреди большого количества другого сложного кода (я стараюсь усреднить 2 LOC на метод, обычно одну или две, длиной 4-8 строк, исвязка, которая составляет только одну строку, усредняющуюся).

Если код длинный и трудный для понимания, я добился большого успеха, вытаскивая метод в свой собственный объект.У меня просто есть метод создания экземпляра некоторого объекта, который выполняет свою задачу, и запрос его результата, тогда код может быть намного проще, часто сводя цикл к одной или двум строкам и позволяя ему иметь метод, который выполняет эту регистрацию, котораязатем вы можете обработать простым вызовом log_error или любым другим именем, которое, по вашему мнению, подходит.

В наши дни я считаю, что сложные процедурные методы - это запах того, что в этом методе есть объект, жестикулирующий.

0 голосов
/ 05 марта 2012

Мое первое впечатление состоит в том, что совершенно очевидно, что ключевое слово next делает в контексте цикла - это хорошо.Тот факт, что "new value" является результатом next "new value", немного растягивается, но я могу это сделать.

Что меня отталкивает, так это то, что next @logger.info('skipping this item because for fun'), вероятно, будет трудно понять.На самом деле не очевидно, что результат вызова info будет возвращен next, и я верю, что многие разработчики будут отбрасывать его.

Хотя код может быть более кратким,это трудно понять.Я либо прокомментирую то, что делает код, либо расскажу что-нибудь еще.

Тем не менее, хороший ответ на ваши два вопроса.Я был бы рад быть разработчиком, поддерживающим ваш код с таким типом мышления!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...