Каковы различие или значение этих стилей блочного кодирования в Ruby?

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

Recipe.find().then(doc3 => {
    data = doc3;
    for (var i = 0; i < data.length; i++) {
      data[i]['categories'].forEach((item, index) => {
        Recipecat.findOne({_id: item}).then(result => {
          item = result.name;
          catsObjectId.push(item);
        });
      })
    }
    console.log(catsObjectId);
  })
  .catch(err => {
      console.log(err);
  });
32
задан Mohsen Nosratinia 8 May 2015 в 13:29
поделиться

6 ответов

Команда направляющих и многие другой rubyists предпочитают использовать фигурные скобки для блоков строки и do...end для многострочных.

единственное функциональное различие между этими двумя - то, что приоритет do...end блок ниже, чем что {...} блок.

38
ответ дан Gordon Wilson 27 November 2019 в 20:04
поделиться

Согласно книга "Кирки" (я смотрю на 2-й выпуск здесь), корректный Gordon: единственной разницей является приоритет:

p.356 (мой курсив):

Фигурные скобки имеют высокий приоритет; do имеет низкий приоритет. Если вызов метода будет иметь параметры, которые не включаются в круглые скобки, , то форма фигурной скобки блока свяжет с последним параметром, не с полным вызовом . Эти do форма будет связывать с вызовом .

См. также p.168 для примера.

22
ответ дан Mike Woodhouse 27 November 2019 в 20:04
поделиться

Две формы эквивалентны.

рекомендуемый стиль должен использовать фигурные скобки для блоков строки и использовать - "заканчиваются" для многострочных блоков.

Редактирование: Austin Ziegler указанный (в комментарии ниже), что две формы имеют уровни приоритета различия: Фигурные скобки имеют более высокий приоритет. Поэтому при вызове метода без круглой скобки блок включенный в {} свяжет с последним аргументом вместо вызывающего метода.

следующий пример был предложен Austin:

def foo
    yield
end

puts foo { "hello" }

puts foo do
    "hello"
end

первое "помещает" печать "привет": нечто получает названный возврат "привет", который является аргументом, помещает.

вторые залоги с ошибкой:

in `foo': no block given

, Так как в этом случае блок-конца связывает с, помещает метод.

Еще раз спасибо в Остин для разрешения этого.

13
ответ дан Community 27 November 2019 в 20:04
поделиться

Ответом Gordon является "Ruby Путь", и хотя это - обычная практика для помещения одной строки в фигурные скобки, он не требуется.

Также отмечают простоту, с которой может действовать на получающееся значение:

cmds.each do |cmd| cmd.upcase! end.sort

# Now, cmds = ["CREATE", "HELP", "LIST", "UPDATE"]

, Хотя Вы могли бы уже видеть, как {} более читаемо здесь и поэтому предпочтенный, если кто-либо еще собирается видеть Ваш код:

cmds.each { |cmd| cmd.upcase! }.sort
11
ответ дан nerdz 27 November 2019 в 20:04
поделиться

Чаще всего разработайте 1, используется для многолинейных блоков, и стиль 2 используется для острот.

do…end синтаксис тесно напоминает другие управляющие структуры Ruby (если, определение, класс), таким образом использование этого для блоков сохраняет появление Вашего кода последовательным и ясным. Но это не работает хорошо на остроты, который является, почему версия скобок предпочтена там.

2
ответ дан Chuck 27 November 2019 в 20:04
поделиться

Я не думаю, что это действительно имеет значение - что это - просто эстетический личный выбор. Некоторые люди предпочитают использовать do...end версия, когда блоку нужны несколько строк и {...} версия когда все на одной строке.

0
ответ дан James Mead 27 November 2019 в 20:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: