Почему это не синтаксическая ошибка?
Если я это сделаю:
(false true)
он терпит неудачу с синтаксической ошибкой, как я ожидаю. Но если я это сделаю:
(false
true)
выполняется код, и он отбрасывает первое условие и возвращает результат второй.
Это считается ошибкой или функцией?
Ответы
Ответ 1
Концы строк не являются обязательными, поэтому в этом случае результат приводит к тому, что синтаксический анализатор интерпретирует его как следующее:
(false; true)
который оценивается просто:
(true)
Если бы это были вызовы метода, то оба они были бы оценены, но только последние будут испускаться. Например:
x = (p "hello"
p "world"
2)
Это выведет "hello" и "world", а x будет равно 2
Ответ 2
Круглые скобки используются для группировки, разрывы строк используются как разделители выражений. Итак, у вас есть просто группа из двух выражений. Нечего отвергать.
Это полезно из-за этой известной идиомы:
def foo(bar = (bar_set = true; :baz))
if bar_set
# optional argument was supplied
end
end
В Ruby просто нет другого способа выяснить, был ли предоставлен дополнительный аргумент или нет.
В принципе, это становится интересным при наличии побочных эффектов, таких как назначение переменной в моем примере или печать на экране в примере на примере @32bitkid. В вашем примере нет побочного эффекта, поэтому вы не могли видеть, что происходит на самом деле.
Ответ 3
Ruby может дать вам предупреждение, если у вас есть предупреждения.
$VERBOSE = true
def foo
(false
true)
end
дает вам
(irb):3: warning: unused literal ignored
В обоих Ruby 1.9.1 patchlevel 378 и Ruby 1.8.7 patchlevel 330.
См. Как запустить все скрипты Ruby с предупреждениями? о том, как запускать все скрипты Ruby с предупреждениями.