Подтвердить что ты не робот

Почему это не синтаксическая ошибка?

Если я это сделаю:

(false true)

он терпит неудачу с синтаксической ошибкой, как я ожидаю. Но если я это сделаю:

(false
 true)

выполняется код, и он отбрасывает первое условие и возвращает результат второй.

Это считается ошибкой или функцией?

4b9b3361

Ответ 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 с предупреждениями.