在Ruby中p和puts有区别吗?
当前回答
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以获得更清晰的信息
其他回答
pfoo输出foo。Inspect后面跟着换行符,即输出Inspect的值而不是to_s,这更适合调试(因为你可以区分1、"1"和"2\b1"之间的区别,如果没有Inspect就不能打印)。
这可能说明了一个关键的区别,即p返回传递给它的值,而as puts返回nil。
def foo_puts
arr = ['foo', 'bar']
puts arr
end
def foo_p
arr = ['foo', 'bar']
p arr
end
a = foo_puts
=>nil
a
=>nil
b = foo_p
=>['foo', 'bar']
b
['foo', 'bar']
基准数据显示看跌期权速度较慢
require 'benchmark'
str = [*'a'..'z']
str = str*100
res = Benchmark.bm do |x|
x.report(:a) { 10.times {p str} }
x.report(:b) { 10.times {puts str} }
end
puts "#{"\n"*10}"
puts res
0.010000 0.000000 0.010000 ( 0.047310)
0.140000 0.090000 0.230000 ( 0.318393)
foo和foo。inspect是一样的
来自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
除了上面的答案,在控制台输出中有一个微妙的差异——即存在/不存在倒逗号/引号——这可能是有用的:
p "+++++"
>> "+++++"
puts "====="
>> =====
我发现如果你想做一个简单的进度条,使用它们的近亲,打印,这个很有用:
array = [lots of objects to be processed]
array.size
>> 20
这给出了100%进度条:
puts "*" * array.size
>> ********************
这将在每次迭代中增加一个增量*:
array.each do |obj|
print "*"
obj.some_long_executing_process
end
# This increments nicely to give the dev some indication of progress / time until completion
>> ******
推荐文章
- 了解Gemfile。锁文件
- 如何确定一个数组是否包含另一个数组的所有元素
- 是什么导致这个ActiveRecord::ReadOnlyRecord错误?
- 最好的打印散列的方法
- Rails:dependent =>:destroy VS:dependent =>:delete_all
- 我可以在不包含Ruby模块的情况下调用实例方法吗?
- 如何将新项目添加到哈希
- 测试一个Ruby类是否是另一个类的子类
- 什么时候使用Struct vs. OpenStruct?
- 数组到哈希Ruby
- 我如何让红宝石打印一个完整的回溯而不是截断一个?
- 如何使用RSpec的should_raise与任何类型的异常?
- 如何创建退出消息
- 忽略GEM,因为没有构建它的扩展
- 在Gem::Specification.reset期间未解决的规格: