查看对象
顺便提一下,Treasure 对象 t1 内部使用了 inspect
方法:
t1.inspect
inspect
是为所有的 Ruby 对象定义的,它将返回一个包含人类可读的表示该对象的字符串。在本例中,它显示这样一些信息:
#<Treasure:0x28962f8 @description="an Elvish weapon forged of gold", @name="Sword">
它是以类名 Treasure 开始,后面跟随一个数字,这是 Ruby 内部用来识别特定对象的的识别码;随后就是对象的名字和变量的值。
Ruby 还提供了p
方法作为打印和查看对象细节的快捷语法,像这样:
p.rb
p(anobject)
来看看如何用 to_s
方法将各种对象以及测试将一个 Treasure 对象在没有重写 to_s
方法的情况下转换成字符串,场试运行 8to_s.rb 程序:
8to_s.rb
puts(Class.to_s) #=> Class
puts(Object.to_s) #=> Object
puts(String.to_s) #=> String
puts(100.to_s) #=> 100
puts(Treasure.to_s) #=> Treasure
正如你将看到的,当 to_s
方法被调用时,类(如 Class,、Object、String 以及 Treasure )只是简单的返回它们的名字;而一个对象,例如 Treasure 对象 t ,返回与 inspect
方法返回值一样的对象标识符:
t = Treasure.new( "Sword", "A lovely Elvish weapon" )
puts(t.to_s)
#=> #<Treasure:0x3308100>
puts(t.inspect)
#=> #<Treasure:0x3308100 @name="Sword", @description="A lovely Elvish weapon">
虽然 7treasure.rb 程序可能作为一个游戏的基础代码包含了不同类型的对象,其代码仍然是重复的。毕竟,为什么 Thing 类有一个 name 而 Treasure 也要包含一个 name 呢?如果把 Treasure 视为一类东西可能是更有意义的。在一个完整的游戏中,其它对象,例如 Rooms(房间) 和 Weapons(武器)可能也是其它的一类东西。是时候应该在一个合适的类层次上开始工作了,这就是我们下一章将要讲到的…