Project1

标题: 请教一点脚本语法问题 [打印本页]

作者: Sion    时间: 2013-1-10 13:39
标题: 请教一点脚本语法问题
本帖最后由 Sion 于 2013-1-11 10:11 编辑

是关于类实例化的问题,举个例子:
  1. class Game_Vehicle < Game_Character #定义载具类
  2.   def initialize(type)
  3.      @type = type
  4.      ...
  5.   end
  6.   def init_move_speed #定义载具速度
  7.     @move_speed = 4 if @type == :boat
  8.     @move_speed = 5 if @type == :ship
  9.     @move_speed = 6 if @type == :airship
  10.   end
  11.      ...#这里省略其它方法定义
  12. end

  13. class Game_Map #地图类
  14.   def create_vehicles #创建载具实例
  15.     @vehicles = []
  16.     @vehicles[0] = Game_Vehicle.new(:boat) #实例化
  17.     @vehicles[1] = Game_Vehicle.new(:ship)
  18.     @vehicles[2] = Game_Vehicle.new(:airship)
  19.   end
  20. end
复制代码
在下有两个问题……请问:
1,
Game_Vehicle.new(:boat)
这样写是实例化该类的同时载入该类第一个方法(这里是initialize()方法载入参数:boat),我这样理解对吗?
那么vehicle = Game_Vehicle.new 就是无参数地调用类内部的第一个方法,相当于vehicle = Game_Vehicle.new()?
2,
:boat似乎叫做实例变量,那么它跟@boat有什么区别?
我觉得这里的:boat更像是一个赋值操作(type = :boat),
就是:boat本身就代表一个“值”。
但是它又跟附加属性里面那个实例变量长得一样:
  1.   attr_reader   :foo
  2.   attr_accessor   :bar
复制代码
实在有点晕,高手路过还请指点一二呀~~~
作者: j433463    时间: 2013-1-10 18:40
本帖最后由 j433463 于 2013-1-10 18:43 编辑

您试过 vehicle = Game_Vehicle.new 吗?会不会出现参数错误?initialize(type) 定义了参数,不加参数是否引起缺少参数的问题?它并没有对不给参数时的 type 预赋值。

@boat 才是实例变量,:boat 日文的帮助文件我不确定看到了它的实际称呼,
只似乎在 Ruby 的文法中提到 "シンボル",翻译软件给出的中文是"象征"、"符号"、"标志"
它是这样给的例子:
  1. :class
  2. :lvar
  3. :method
  4. :$gvar
  5. :@ivar
  6. :+
复制代码
文法:
  1. ':' 识别子
  2. ':' 変数名
  3. ':' 演算子
复制代码
后面说明我翻译的结果,大概意思是:
  1. 返回一对一相应的任何字符串,符号是符号类的实例,符号始终是一个唯一对象,即使已评估多次返回相同的对象。
复制代码
按一般情况来说 :boat 它代表一个 def boat 方法,也就是 : 后面接的 boat 只是识别子,也可能是变数名,也可能是演算子。
作者: feizhaodan    时间: 2013-1-10 19:09
本帖最后由 feizhaodan 于 2013-1-10 19:12 编辑

Game_Vehicle类的initialize方法接收一个参数type,因为没有给这个参数定默认值,所以你必须在.new的时候给正好一个参数。
.new表示创建一个该类的实例。看了一下Ruby手册,貌似是呼出allocate方法来创建一个空的实例,然后再使用initialize方法来初始化。new的参数会原搬不动的传递给initialize。allocate方法最好还是不要定义比较好。不知道会发生什么。
实例变量简单来说就是在一个实例里的变量。一般就是指你在类定义里面使用的@变量。不同的就是你可以用instance_variable_set给一个实例定义一个新的实例变量。
  1. class A
  2.   def initialize
  3.      @var1 = 1
  4.   end
  5.   def print_something
  6.      p @var1
  7.      p @var2
  8. end
  9. a1 = A.new
  10. a2 = A.new
  11. a2.instance_variable_set(:@var2,2)
  12. a1.print_something
  13. a2.print_something
复制代码
这是一个例子。
控制台因该会出现
  1. 1
  2. nil
  3. 1
  4. 2
复制代码
这样。

然后关于:boat,其实这个是一个Symbol类的实例。使用":名称"的格式生成的Symbol,只要“名称”的部分相同,那么他就一定是同一个实例。一般用来进行判定,有的时候也可以用来代替判定用的字符串。




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