查看对象

顺便提一下,Treasure 对象 t1 内部使用了 inspect 方法:

  1. t1.inspect

inspect 是为所有的 Ruby 对象定义的,它将返回一个包含人类可读的表示该对象的字符串。在本例中,它显示这样一些信息:

  1. #<Treasure:0x28962f8 @description="an Elvish weapon forged of gold", @name="Sword">

它是以类名 Treasure 开始,后面跟随一个数字,这是 Ruby 内部用来识别特定对象的的识别码;随后就是对象的名字和变量的值。

Ruby 还提供了p方法作为打印和查看对象细节的快捷语法,像这样:

p.rb
  1. p(anobject)

来看看如何用 to_s 方法将各种对象以及测试将一个 Treasure 对象在没有重写 to_s 方法的情况下转换成字符串,场试运行 8to_s.rb 程序:

8to_s.rb
  1. puts(Class.to_s) #=> Class
  2. puts(Object.to_s) #=> Object
  3. puts(String.to_s) #=> String
  4. puts(100.to_s) #=> 100
  5. puts(Treasure.to_s) #=> Treasure

正如你将看到的,当 to_s 方法被调用时,类(如 Class,、Object、String 以及 Treasure )只是简单的返回它们的名字;而一个对象,例如 Treasure 对象 t ,返回与 inspect 方法返回值一样的对象标识符:

  1. t = Treasure.new( "Sword", "A lovely Elvish weapon" )
  2. puts(t.to_s)
  3. #=> #<Treasure:0x3308100>
  4. puts(t.inspect)
  5. #=> #<Treasure:0x3308100 @name="Sword", @description="A lovely Elvish weapon">

虽然 7treasure.rb 程序可能作为一个游戏的基础代码包含了不同类型的对象,其代码仍然是重复的。毕竟,为什么 Thing 类有一个 name 而 Treasure 也要包含一个 name 呢?如果把 Treasure 视为一类东西可能是更有意义的。在一个完整的游戏中,其它对象,例如 Rooms(房间) 和 Weapons(武器)可能也是其它的一类东西。是时候应该在一个合适的类层次上开始工作了,这就是我们下一章将要讲到的…