Ruby 1.9 печатает строки дважды - PullRequest
1 голос
/ 03 февраля 2011

<code>class Test
def printsomething
p "lol"
end
end
teet = Test.new
p "#{teet.printsomething}"

Выход для вышеприведенного кода: "lol" \ n "lol"

почему это происходит? Я использую ruby ​​1.9.2 Archlinux x86_64

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

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

Просто замените p на puts

Вы можете понять, что я имею в виду, если вы сделаете это:

p "#{teet}"
=> "#<Test:0x00000100850678>"

Обратите внимание, как это внутри кавычек.

0 голосов
/ 04 февраля 2011

Первое, что делает Ruby, когда видит строку в двойных кавычках, заменяет части #{expr} результатом вычисления expr.Например, "#{2+2}" становится "4".Итак, давайте посмотрим, что здесь происходит.Ruby оценивает teet.printsomething.Во время этой оценки он выполняет метод и печатает «lol» в 3-й строке.Обратите внимание, что хотя метод printsomething не имеет оператора return, он, тем не менее, возвращает некоторое значение: это значение, возвращаемое последним оператором этого метода.Возвращаемое значение p object само по себе object, поэтому результат метода printsomething равен "lol".Этот результат теперь заменяет часть #{} в строке, и строка становится "lol" вместо "#{teet.printsomething}".Теперь метод p в 7-й строке выполняется и снова выдает «lol».

Что произойдет, если вы замените p на puts?Разница в том, что возвращаемое значение puts равно nil.Когда результат expr равен nil, все выражение #{} заменяется пустой строкой.Таким образом, 7-я строка становится puts "".В результате вся программа выдает «lol», за которым следует пустая строка.

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