在Ruby中p和puts有区别吗?
当前回答
来自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 "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
这可能说明了一个关键的区别,即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)
同样重要的是要注意,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调用,但在实践中并不明显。
推荐文章
- 我如何在Ruby中解析YAML文件?
- Rails中的OO设计:在哪里放置东西
- 给定一个类,查看实例是否有方法(Ruby)
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 如何创建一个私有类方法?
- 无法安装pg gem
- 双* (splat)操作符做什么
- 如何使用Ruby on Rails进行HTTP请求?
- 如何从rake任务中提前返回?
- 什么&。(&点)在Ruby中是什么意思?
- 是什么阻碍了Ruby和Python获得V8的Javascript速度?
- 运行pod设置给我“坏的解释器:没有这样的文件或目录”错误
- 在Ubuntu上安装sqlite3-ruby错误
- Ruby有什么Python没有的,反之亦然?
- find_spec_for_exe':无法找到gem bundle (>= 0.a) (gem::GemNotFoundException)