class Test
def printsomething
p "lol"
end
end
teet = Test.new
p "#{teet.printsomething}"
上面代码的输出是“lol”\ n“lol”
为什么会这样?我正在运行ruby 1.9.2 Archlinux x86_64
答案 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”后跟一个空行。