为什么这个Ruby对象似乎做同样的to_s
和inspect
方法?
p
方法调用inspect
并放置/打印调用to_s
以表示对象。
如果我跑
class Graph
def initialize
@nodeArray = Array.new
@wireArray = Array.new
end
def to_s # called with print / puts
"Graph : #{@nodeArray.size}"
end
def inspect # called with p
"G"
end
end
if __FILE__ == $0
gr = Graph.new
p gr
print gr
puts gr
end
我得到了
G
Graph : 0
Graph : 0
to_s
和inspect
之间有什么区别?puts
,print
和p
之间有什么区别?如果我注释掉to_s
或inspect
函数,我会得到以下结论。
#<Graph:0x100124b88>
#<Graph:0x100124b88>
答案 0 :(得分:49)
inspect
更多用于调试,to_s
用于最终用户或显示目的。
例如,[1,2,3].to_s
和[1,2,3].inspect
会产生不同的输出。
答案 1 :(得分:32)
inspect
是一种方法,默认情况下会告诉您类名,实例的object_id
,并列出实例的实例变量。
print
和puts
用于将对象的to_s
方法的值设置为STDOUT
。正如Ruby的文档所示,Object#to_s
返回一个表示对象的字符串 - 用于最终用户的可读性。
print
和puts
彼此相同,但puts
会自动附加换行符,而print
则不会。{/ p>
答案 2 :(得分:13)
要与Python进行比较,to_s
与__str__
类似,inspect
与__repr__
类似。 to_s
为您提供了一个字符串,而inspect
为您提供了该对象的字符串表示形式。如果愿意,可以使用后者构造一个对象。
答案 3 :(得分:5)
此外,在某些对象上有一个to_str
方法,当需要类似String的对象时,可以调用它,而不仅仅是字符串表示。 (尝试IRB:[1,2,3].to_str
但它会失败,但[1,2,3].to_s
不会。)我觉得我应该提到这个因为我之前被它咬了过来:))
答案 4 :(得分:4)
对于开始使用Ruby Koans后到达此处的所有人,to_s
和inspect
输出不同的简单示例如下:
nil.to_s # will yield an empty string, ie ""
nil.inspect # will yield the string "nil"
答案 5 :(得分:3)
puts
通常打印在对象上应用to_s
的结果,而p
打印inspect
对象的结果。
inspect
和to_s
之间存在细微差别:
inspect
,当应用于对象时,返回对象十六进制代码
以及实例变量 to_s
,当应用于对象时,仅返回对象十六进制代码
class Item def initialize(abc) @abc=abc end end x= Item.new(22) puts x #prints object x hex code puts x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc puts x.to_s #prints object x hex code p x #prints object x hex code WITH INSTANCE VARIABLE @abc p x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc p x.to_s #prints object x hex code
答案 6 :(得分:1)
2.0.0p195 :075 > puts (1..5).to_a # Put an array as a string.
1
2
3
4
5
=> nil
2.0.0p195 :076 > puts (1..5).to_a.inspect # Put a literal array.
[1, 2, 3, 4, 5]
=> nil
2.0.0p195 :077 > puts :name, :name.inspect
name
:name
=> nil
2.0.0p195 :078 > puts "It worked!", "It worked!".inspect
It worked!
"It worked!"
=> nil
2.0.0p195 :079 > p :name # Same as 'puts :name.inspect'
:name
=> :name
答案 7 :(得分:1)
来自Chris Pine的学习计划书的回答
“inspect方法与to_s很相似,不同之处在于它返回的字符串会尝试显示用于构建传递对象的ruby代码。”
因此,inspect方法将返回一个数组,例如像......
import React from 'react';
import { Drivers } from '../api/drivers';
export default class Riders extends React.Component {
renderNames() {
return this.props.riders.join(' - ');
}
render() {
return (
<div>
<p>{this.renderNames()}</p>
</div>
);
}
}
puts / to_s将返回的位置
[25, 16, 9, 4, 1, 0]
答案 8 :(得分:0)
请参阅以下链接以获取更多信息和示例,说明&#34; to_s&#34;和&#34;检查&#34;以及&#34; puts&#34;之间的区别和&#34; p&#34;。 https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects