Аргументы метода ruby, написанные после имени метода и пробела, приводят к ошибке

Я пишу метод.

def additionner (x,y) 

  puts (x * y) 

end 

additionner(2,7)

Работает, но если поставить пробел после вызова метода, то не работает, почему? Обратите внимание, что нет никакой разницы, есть ли пробел между именем метода и скобками внутри определения метода.

def additionner (x,y)

  puts (x * y)

end

additionner (2,7)

(repl):4: синтаксическая ошибка, неожиданное ‘,’, ожидание ‘)’ addner (2,7)

в версии: ruby ​​2.5.5p157 (2019-03-15 редакция 67260) [x86_64-linux]


person kouty    schedule 02.09.2019    source источник
comment
Именно так был разработан рубин. Причина, вероятно, в том, что круглые скобки в вызовах функций и определениях являются необязательными, поэтому их отсутствие делает неоднозначным то, что это вызов функции с двумя параметрами. Для определения пространство однозначно, вероятно, из-за ключевого слова def.   -  person ggorlen    schedule 03.09.2019
comment
@ggorlen Таким образом, пробел неоднозначен, если он написан после вызова метода, а скобки не устраняют неоднозначность.   -  person kouty    schedule 03.09.2019
comment
Да, потому что круглые скобки также являются кортежем в дополнение к спискам параметров. Смотрите ссылку на дубляж. Ruby не знает, пытаетесь ли вы вызвать метод с одним литералом кортежа или со списком параметров. В любом случае, нет причин ставить пробелы между функциями и списками их параметров, так что это своего рода академический вопрос.   -  person ggorlen    schedule 03.09.2019
comment
@ggorlen Да, я уже прочитал это. Спасибо.   -  person kouty    schedule 03.09.2019
comment
Также см. предупреждение об уничтожении интерпретируется как префикс аргумента"> stackoverflow.com/questions/41821628/   -  person mu is too short    schedule 03.09.2019
comment
Круглые скобки можно использовать для группировки выражений или вызова методов. Когда вы говорите m(a, b), это круглые скобки вызова метода; когда вы говорите m (a, b), это круглые скобки для группировки выражений. Затем, поскольку a, b не является выражением (т. е. в Ruby нет оператора запятой), m (a, b) является синтаксической ошибкой.   -  person mu is too short    schedule 03.09.2019
comment
@muistooshort Теперь это имеет смысл. Он отличается от ответа в исходном сообщении, которое я продублировал. Потому что из ответа кажется, что пробел - это скобка, поэтому пробел + контент +) было бы хорошо, а его нет. С вашим ответом логически все ясно.   -  person kouty    schedule 03.09.2019
comment
Спасибо. Тот, на который я ответил, был помечен как дубликат, поэтому я решил, что этот вопрос более каноничен, чем тот, на который я ответил. Позор, что на этот вопрос уже есть ответ здесь: ссылки не идут в обе стороны   -  person mu is too short    schedule 03.09.2019
comment
Таким образом, кажется, что они связаны в обе стороны, но обратные ссылки как бы скрыты в поле «Связанная боковая панель».   -  person mu is too short    schedule 03.09.2019