Ruby — новые строки и операторы

Рассмотрим следующий код:

x = 4
y = 5
z = (y + x)

puts z

Как и следовало ожидать, вывод равен 9. Если вы вводите новую строку:

x = 4
y = 5
z = y
+ x

puts z

Затем он выводит 5. Это имеет смысл, поскольку интерпретируется как два отдельных утверждения (z = y и +x).

Однако я не понимаю, как это работает, когда у вас есть новая строка в скобках:

x = 4
y = 5
z = (y
+ x)

puts z

Выход 4. Почему?


person mopoke    schedule 11.02.2010    source источник


Ответы (3)


(Отказ от ответственности: я вообще не программист Ruby. Это всего лишь дикая догадка.)

Со скобками вы получаете z, которому присваивается значение

y
+x

Который оценивается как значение последнего выполненного оператора.

person Anon.    schedule 11.02.2010
comment
+1. Я пытался объяснить основную концепцию незавершенных команд, когда понял, что на выходе было 4, а не 9. Хорошо получилось :) - person Matchu; 11.02.2010
comment
Это имеет большой смысл. Я исходил из того же примера в Scala, где он обрабатывает его как z = (y + x) и выводит 9. Хорошее объяснение :-) - person mopoke; 11.02.2010
comment
Многострочные круглые скобки по существу являются блоком, и значением блока является последний оператор в нем. - person kejadlen; 11.02.2010

Завершите строку символом \, чтобы продолжить выражение на следующей строке. Это дает правильный вывод:

x = 4
y = 5
z = (y \
  + x)
puts z

выходы 9

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

person Kevin    schedule 11.02.2010

Ну, вам не понадобится экранирующий символ \, если ваши строки заканчиваются оператором

a = 4
b = 5
z = a +
    b

puts z 
# => 9
person Roman Gonzalez    schedule 11.02.2010
comment
Я использую эту технику, чтобы закончить строку точкой, если я соединяю в цепочку несколько методов. - person glenn jackman; 11.02.2010