Ruby 中的 to_s 和 inspect 方法的比较

yufei       6 年, 3 月 前       2416

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 同时提供了另一个方法 inspectinspect 方法把一个对象表示为字符串,在需要的时候,还能直接从该字符串还原回对象。

[1,2,3].inspect # "[1,2,3]"

inspect 方法会隐式的自动调用 p 方法 ,所以下面的结果和 inspect 结果是一样的

p [1,2,3] # "[1,2,3]"

结束语

既然有两个方法可以将字符串表示为对象,那么,to_sinspect 应该如何区分和在什么场景下使用呢 ?

  • to_s 方法一般用于记录目的
  • inspect 方法一般用于调试目的

其它情况下自行斟酌。比如如果要将一个对象持久化到数据库,一般可以使用 inspect 而非 to_s ,因为可以在合适的时候还原回对象

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.