Project1

标题: 关于Game_Actors类的疑问 [打印本页]

作者: tan12345    时间: 2013-12-17 15:44
标题: 关于Game_Actors类的疑问
最近无聊看代码,看到Game_Actors这个类,疑问来了:
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 获取角色
  3.   #--------------------------------------------------------------------------
  4.   def [](actor_id)
  5.     return nil unless $data_actors[actor_id]
  6.     @data[actor_id] ||= Game_Actor.new(actor_id)
  7.   end

这段代码是什么意思?定义[]?定义[]了还传参?将actor_id传给这个方法?
里面的内容第二行@data[actor_id] ||= Game_Actor.new(actor_id)是什么意思?尤其是||=这个运算符……我只知道+=、-=之类的,整个表达式的意思是?
抱歉,我是java程序员,所以对ruby不是很熟,望各位大大包含。
作者: myownroc    时间: 2013-12-17 16:04
本帖最后由 myownroc 于 2013-12-17 16:12 编辑

定义[]可以理解为实例数组化(只读)
例如
  1. a=Game_Actors.new
  2. x=a[0]
复制代码
如果没有定义[],后面x=a[0]就不能实现,并且报错。
这个在Game_Variables类和Game_Switches类也是一样。
||=可以百度找到。
例如:
  1. a||=0
复制代码
当a存在但还没赋值时,a赋值0;若已赋值,则不做操作。
整个代码意思是:
如果数据库中第id个角色不存在,实例就返回空;存在时,若还没赋值,就将数据库的相应内容赋值给实例。
作者: 喵呜喵5    时间: 2013-12-17 16:26
个人理解:
def []算是Ruby语言的一个特性,除了部分关键字,其他东西在Ruby中都是方法,包括在数组和哈希中使用的这个方括号,只要需要,我可以在每个类中为这个方括号获得的内容设置一个特殊的规则
例如
我想定义一个直角坐标系Point,这个直角坐标系有X坐标和Y坐标,这时候重定义[]就可以实现用
@x = Point.new
@x[x],@x[y]
这样类似的形式方便的获取我这个直角坐标系中某一点X的横坐标和纵坐标

具体可以参考《Ruby编程语言(作者:(美)弗拉纳根,松本行弘)》这本书中下面这个例子


作者: 喵呜喵5    时间: 2013-12-17 16:29
后面那个||=是个缩写形式的赋值操作符,具体的……同样还是出自上面那本书,自己看吧:




作者: tan12345    时间: 2013-12-17 16:32
myownroc 发表于 2013-12-17 16:04
定义[]可以理解为实例数组化(只读)
例如如果没有定义[],后面x=a[0]就不能实现,并且报错。
这个在Game_Var ...

非常感谢指导,谢谢!
作者: tan12345    时间: 2013-12-17 16:35
喵呜喵5 发表于 2013-12-17 16:26
个人理解:
def []算是Ruby语言的一个特性,除了部分关键字,其他东西在Ruby中都是方法,包括在数组和哈希 ...

感谢喵呜喵5大大,果然想更深的写RM必须从基础抓起啊……




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1