Этот вопрос уже получил несколько хороших ответов.
Таким образом, этот метод использует преимущества того, как язык компилируется. То есть JavaScript «коротких замыканий» оценивает булевы операторы и возвращает значение, связанное либо с первым значением не-ложной переменной, либо с любой последней переменной. См. Объяснение Анурага этих значений, которые будут оцениваться как ложные.
Использование этого метода не является хорошей практикой по нескольким причинам;
Использование тернарного оператора требует немного большего набора текста, но оно четко различает вычисляемое булево выражение и назначаемое значение. Кроме того, он может быть закодирован, поэтому типы выполнения по умолчанию, выполняемые выше, могут быть воссозданы.
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
Блок, написанный с помощью фигурных скобок, связывается с методом ввода, который является то, что ваше намерение, и он будет работать нормально.
Тем не менее, блок, который инкапсулирован в блоке DO / END, будет связываться с P-методом. Из-за этого не имеет ни связанного блока. В этом случае INJECT будет интерпретировать аргумент в этом случае 0 в качестве имени метода для вызова каждого объекта. Bacuase 0 не является символом, который можно преобразовать в вызов метода, это даст предупреждение.
Проблема с 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
Это выглядит как эффект разницы в привязке между do/end и скобками:
скобки, используемые в том виде, в котором вы находитесь выше, будут привязываться к последней функции, а do/end - к первой.
Я думаю, что это довольно странный способ сказать это, но в основном первая инстанция передает блок функции "инжектор", в то время как вторая на самом деле пытается передать блок первому методу "p".