设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1952|回复: 2
打印 上一主题 下一主题

[已经解决] 请教一点脚本语法问题

[复制链接]

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

跳转到指定楼层
1
发表于 2013-1-10 13:39:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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
复制代码
实在有点晕,高手路过还请指点一二呀~~~

点评

Debug神物:控制台。 另外好像没点评成功,我的那个Ruby手册是日文版的囧  发表于 2013-1-10 19:36
纯正日文版抱歉囧  发表于 2013-1-10 19:12

Lv1.梦旅人

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
帖子
1543
2
发表于 2013-1-10 18:40:19 | 只看该作者
本帖最后由 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 只是识别子,也可能是变数名,也可能是演算子。

点评

试了一下还真报错了- -b,我现在的问题就是这个 class.new 就是默认执行class类里的第一个方法吗?  发表于 2013-1-10 18:59
不赋值应该自动载入参数nil吧  发表于 2013-1-10 18:57
谢啦,我就是不清楚这个:class.new 就是默认执行类里的第一个方法吗? 后面那个:boat先不管它了,照葫芦画瓢用就是了……  发表于 2013-1-10 18:54
修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

Mr.Gandum

梦石
0
星屑
226
在线时间
2070 小时
注册时间
2007-1-31
帖子
3039

贵宾

3
发表于 2013-1-10 19:09:12 | 只看该作者
本帖最后由 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,只要“名称”的部分相同,那么他就一定是同一个实例。一般用来进行判定,有的时候也可以用来代替判定用的字符串。

点评

其实你点评成功了囧  发表于 2013-1-10 19:39
这个控制台好像很有趣,以前都没注意到  发表于 2013-1-10 19:34
强者啊!这样的说明我就做不到的,讲得真是清楚明白。  发表于 2013-1-10 19:33
谢谢解答。题外话:大神,你的ruby手册是电子中文版的么 传个给我吧T_T  发表于 2013-1-10 19:12
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-29 02:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表