Ruby 1.9打印两次字符串

时间:2011-02-03 09:32:40

标签: ruby

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 个答案:

答案 0 :(得分:2)

p是一个不是真正用于输出文本字符串的检查。它的作用是打印出对象的文字内容而不是转义字符串。

只需将p替换为puts

即可

如果你这样做,你可以看到我的意思:

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

注意它是如何在引号内。

答案 1 :(得分:0)

Ruby在看到双引号字符串时所做的第一件事就是用评估#{expr}的结果替换expr部分。例如,"#{2+2}"变为"4"。那么,让我们看看这里发生了什么。 Ruby评估teet.printsomething。在此评估期间,它执行该方法并在第3行中打印“lol”。请注意,虽然方法printsomething没有return语句,但它仍会返回一些值:它是该方法的最后一个语句返回的值。 p object的返回值是object本身,因此方法printsomething的结果为"lol"。此结果现在替换字符串中的#{}部分,字符串变为"lol"而不是"#{teet.printsomething}"。现在执行第7行中的p方法并再次输出“lol”。

如果将p替换为puts会怎样?不同之处在于puts的返回值为nil。当expr的结果为nil时,整个表达式#{}将替换为空字符串。所以第7行变为puts ""。结果,整个程序输出“lol”后跟一个空行。