Ruby Print Inject Do Синтаксис

Этот вопрос уже получил несколько хороших ответов.

Таким образом, этот метод использует преимущества того, как язык компилируется. То есть JavaScript «коротких замыканий» оценивает булевы операторы и возвращает значение, связанное либо с первым значением не-ложной переменной, либо с любой последней переменной. См. Объяснение Анурага этих значений, которые будут оцениваться как ложные.

Использование этого метода не является хорошей практикой по нескольким причинам;

  1. Чтение кода: это использование булевых операторов, и если поведение того, как эти компиляции не поняты, ожидаемым результатом будет логическое значение.
  2. Стабильность: это использование функции того, как язык компилируется, который несовместим на нескольких языках, и из-за этого это потенциально может быть нацелено на изменения в будущем.
  3. Документированные функции: существует существующую альтернативу, которая удовлетворяет эту потребность и согласуется с другими языками. Это был бы тернарный оператор: ()? Значение 1: Значение 2.

Использование тернарного оператора требует немного большего набора текста, но оно четко различает вычисляемое булево выражение и назначаемое значение. Кроме того, он может быть закодирован, поэтому типы выполнения по умолчанию, выполняемые выше, могут быть воссозданы.

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f =  ( a ) ? a : 
                ( b ) ? b :
                       ( c ) ? c :
                              ( d ) ? d :
                                      e;

alert(f); // 4
30
задан L0j1k 11 June 2014 в 17:13
поделиться

3 ответа

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

Тем не менее, блок, который инкапсулирован в блоке DO / END, будет связываться с P-методом. Из-за этого не имеет ни связанного блока. В этом случае INJECT будет интерпретировать аргумент в этом случае 0 в качестве имени метода для вызова каждого объекта. Bacuase 0 не является символом, который можно преобразовать в вызов метода, это даст предупреждение.

36
ответ дан 27 November 2019 в 23:59
поделиться

Проблема с P в начале. Если вы опустите это, вы увидите, что оба работают нормально:

# Works!
[5, 6, 7].inject(0) do |sum, i| # Correctly binds to `inject`.
  sum + i
end

# Works too!
[5, 6, 7].inject(0) { |sum, i|  # Correctly binds to `inject`.
  sum + i
}

, но это не будет работать:

# Kablammo! "p" came first, so it gets first dibs on your do..end block.
# Now inject has no block to bind to!
p [5, 6, 7].inject(0) do |sum, i|   # Binds to `p` -- not what you wanted.
  sum + i
end
7
ответ дан 27 November 2019 в 23:59
поделиться

Это выглядит как эффект разницы в привязке между do/end и скобками:

скобки, используемые в том виде, в котором вы находитесь выше, будут привязываться к последней функции, а do/end - к первой.

Я думаю, что это довольно странный способ сказать это, но в основном первая инстанция передает блок функции "инжектор", в то время как вторая на самом деле пытается передать блок первому методу "p".

6
ответ дан 27 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

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