在Ruby中p和puts有区别吗?
当前回答
这两个相等:
p "Hello World"
puts "Hello World".inspect
(inspect提供了一个比to_s方法更直观的对象视图)
其他回答
P方法将打印更广泛的可调试消息,其中put将美化消息代码。
例:请看下面的代码行:
msg = "hey, Use \#{ to interpolate expressions"
puts msg #clean msg
p msg #shows \ with #
输出将是
hey, Use #{ to interpolate expressions
"hey, Use \#{ to interpolate expressions"
查看输出PIC以获得更清晰的信息
来自ruby-2.4.1文档
puts
将(obj,…)→nil 将给定的对象写入ios。在任意换行符之后写入换行符 不要已经以换行符序列结束。返回nil。 必须打开流以便写入。如果使用数组调用 参数,将每个元素写入新行。每个给定对象 这不是一个字符串或数组将通过调用它的to_s来转换 方法。如果不带参数调用,则输出一个换行符。
让我们在irb上试试
# always newline in the end
>> puts # no arguments
=> nil # return nil and writes a newline
>> puts "sss\nsss\n" # newline in string
sss
sss
=> nil
>> puts "sss\nsss" # no newline in string
sss
sss
=> nil
# for multiple arguments and array
>> puts "a", "b"
a
b
=> nil
>> puts "a", "b", ["c", "d"]
a
b
c
d
=> nil
p
P (obj)→obj点击切换源 P (obj1, obj2,…)→[obj,…] P()→nil 对于每个对象,直接写入obj。Inspect后面跟着一个换行符指向程序的标准输出。
在irb
# no arguments
>> p
=> nil # return nil, writes nothing
# one arguments
>> p "sss\nsss\n"
"sss\nsss\n"
=> "aaa\naaa\n"
# multiple arguments and array
>> p "a", "b"
"a"
"b"
=> ["a", "b"] # return a array
>> p "a", "b", ["c", "d"]
"a"
"b"
["c", "d"]
=> ["a", "b", ["c", "d"]] # return a nested array
同样重要的是要注意,put“react”到一个定义了to_s的类,而p没有。例如:
class T
def initialize(i)
@i = i
end
def to_s
@i.to_s
end
end
t = T.new 42
puts t => 42
p t => #<T:0xb7ecc8b0 @i=42>
这直接来自.inspect调用,但在实践中并不明显。
foo和foo。inspect是一样的
pfoo输出foo。Inspect后面跟着换行符,即输出Inspect的值而不是to_s,这更适合调试(因为你可以区分1、"1"和"2\b1"之间的区别,如果没有Inspect就不能打印)。
推荐文章
- 是否可以在MiniTest中运行单个测试?
- 如何在Ruby中生成a和b之间的随机数?
- 无法安装gem -未能建立gem本地扩展-无法加载这样的文件——mkmf (LoadError)
- 如何在Ruby中创建文件
- 什么是Ruby文件。开放模式和选项?
- Ruby数组到字符串的转换
- 如何分割(块)一个Ruby数组成X元素的部分?
- Ruby中“or”和||的区别?
- 如何测试参数是否存在在轨道
- 在Ruby中不创建新字符串而修饰字符串的规范方法是什么?
- RVM不是一个函数,用' RVM use…’不会起作用
- 了解Gemfile。锁文件
- 如何确定一个数组是否包含另一个数组的所有元素
- 是什么导致这个ActiveRecord::ReadOnlyRecord错误?
- 最好的打印散列的方法