Почему это не синтаксическая ошибка? - PullRequest
12 голосов
/ 07 декабря 2011

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

(false true)

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

(false
 true)

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

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

Ответы [ 3 ]

15 голосов
/ 08 декабря 2011

Окончания строк являются необязательными, поэтому в этом случае возвращение заставляет синтаксический анализатор интерпретировать его следующим образом:

(false; true)

, что оценивается просто:

(true)

это были вызовы методов, тогда оба были бы оценены, но только последний был бы передан.Например:

x = (p "hello"
p "world"
2)

Это выведет "hello" и "world", а x будет равно 2

7 голосов
/ 08 декабря 2011

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

Это полезно из-за этой хорошо известной идиомы:

def foo(bar = (bar_set = true; :baz))
  if bar_set
    # optional argument was supplied
  end
end

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

По сути, это становится интересным при наличии побочных эффектов, таких как назначение переменной в моем примере или печать на экране в примере @ 32bitkid.В вашем примере нет побочного эффекта, поэтому вы не могли видеть, что на самом деле происходит .

2 голосов
/ 08 декабря 2011

Ruby может выдать вам предупреждение, если у вас есть предупреждения.

$VERBOSE = true
def foo
  (false
   true)
end

дает вам

(irb):3: warning: unused literal ignored

В Ruby 1.9.1 и 378 и Ruby 1.8.7 на уровне 330.

См. Как запустить все сценарии Ruby с предупреждениями? , как запустить все сценарии Ruby с предупреждениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...