Ошибка конкатенации строк - PullRequest
8 голосов
/ 02 мая 2011

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

Это работает точно так, как вы ожидаете:

(0..9).each { |n| puts n.to_s + "^2 = " + (n**2).to_s }

Это выдает ошибку:

(0..9).each { |n| puts n.to_s +"^2 = "+ (n**2).to_s }

Ошибка:

NoMethodError: undefined method '+@' for "^2 = ":String

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

Почему именно это происходит?

1 Ответ

12 голосов
/ 02 мая 2011

n.to_s +"^2 = " анализируется как n.to_s(+"^2 = "), что синтаксически допустимо и означает «выполнить унарные операции плюс со строкой ^2 = и затем передать результат в качестве аргумента to_s». Однако, поскольку строки не имеют унарной операции плюс (представленной методом +@), вы получите NoMethodError ( не синтаксическая ошибка).

Причина, по которой он анализируется таким образом, а не как n.to_s() + "^2 = ", заключается в том, что если бы он был проанализирован таким образом, то puts +5 или puts -x также пришлось бы анализировать как puts() + 5 и puts() - x, а не puts(+5) и puts(-x) - и в этом примере довольно ясно, что последний - это то, что было задумано.

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