puts 和 字符串插值
当把一个对象作为参数传递给 puts()
方法的时候,puts
方法会立即自动隐式的调用对象的 to_s()
方法将对象转换为字符串 ( string ) ,字符串对象除外。
例如,下面的代码,我们创建了一个 Factory
的类,并在该类上定义了一个方法 to_s()
class Factory def initialize @workers = { workers: [] } @machines = { machines: [] } end def add_worker(name) @workers[:workers] << { :name => name } end def add_machines(id) @machines[:machines] << { :id => id } end def to_s ws = @workers[:workers].map { |w| w[:name] }.join(', ') ms = @machines[:machines].map { |m| m[:id] }.join(', ') <<-EOF Worker Names[#{@workers[:workers].count}]: #{ws} Machine IDs[#{@machines[:machines].count}]: #{ms} EOF end end factory = Factory.new factory.add_worker('Jim') factory.add_worker('Larry') factory.add_worker('Doug') factory.add_machines('12QC-2323') factory.add_machines('12QC-2324') factory.add_machines('12QC-2325')
当我们使用 puts()
方法输出对象时,就会立即隐式的调用 factory.to_s()
方法了
> puts factory Worker Names[3]: Jim, Larry, Doug Machine IDs[3]: 12QC-2323, 12QC-2324, 12QC-2325
当使用字符串插值法调用一个对象时,也会立即调用该对象的 to_s()
方法
> "#{factory}" " Worker Names[3]: Jim, Larry, Doug\n Machine IDs[3]: 12QC-2323, 12QC-2324, 12QC-2325\n"
inspect()
to_s
方法很好用,但如果我们要把一个对象表示为字符串,在合适的时候有需要从字符串还原回该对象的时候。 to_s
方法就无能为力了,因为它没有携带该对象的任何元数据。
好在 Ruby
同时提供了另一个方法 inspect
。 inspect
方法把一个对象表示为字符串,在需要的时候,还能直接从该字符串还原回对象。
[1,2,3].inspect # "[1,2,3]"
inspect
方法会隐式的自动调用 p
方法 ,所以下面的结果和 inspect
结果是一样的
p [1,2,3] # "[1,2,3]"
结束语
既然有两个方法可以将字符串表示为对象,那么,to_s
和 inspect
应该如何区分和在什么场景下使用呢 ?
to_s
方法一般用于记录目的inspect
方法一般用于调试目的
其它情况下自行斟酌。比如如果要将一个对象持久化到数据库,一般可以使用 inspect
而非 to_s
,因为可以在合适的时候还原回对象
目前尚无回复