Project1
标题:
请教一点脚本语法问题
[打印本页]
作者:
Sion
时间:
2013-1-10 13:39
标题:
请教一点脚本语法问题
本帖最后由 Sion 于 2013-1-11 10:11 编辑
是关于类实例化的问题,举个例子:
class Game_Vehicle < Game_Character #定义载具类
def initialize(type)
@type = type
...
end
def init_move_speed #定义载具速度
@move_speed = 4 if @type == :boat
@move_speed = 5 if @type == :ship
@move_speed = 6 if @type == :airship
end
...#这里省略其它方法定义
end
class Game_Map #地图类
def create_vehicles #创建载具实例
@vehicles = []
@vehicles[0] = Game_Vehicle.new(:boat) #实例化
@vehicles[1] = Game_Vehicle.new(:ship)
@vehicles[2] = Game_Vehicle.new(:airship)
end
end
复制代码
在下有两个问题……请问:
1,
Game_Vehicle.new(:boat)
这样写是实例化该类的同时载入该类第一个方法(这里是initialize()方法载入参数:boat),我这样理解对吗?
那么vehicle = Game_Vehicle.new 就是无参数地调用类内部的第一个方法,相当于vehicle = Game_Vehicle.new()?
2,
:boat似乎叫做实例变量,那么它跟@boat有什么区别?
我觉得这里的:boat更像是一个赋值操作(type = :boat),
就是:boat本身就代表一个“值”。
但是它又跟附加属性里面那个实例变量长得一样:
attr_reader :foo
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 的文法中提到 "シンボル",翻译软件给出的中文是"象征"、"符号"、"标志"
它是这样给的例子:
:class
:lvar
:method
:$gvar
:@ivar
:+
复制代码
文法:
':' 识别子
':' 変数名
':' 演算子
复制代码
后面说明我翻译的结果,大概意思是:
返回一对一相应的任何字符串,符号是符号类的实例,符号始终是一个唯一对象,即使已评估多次返回相同的对象。
复制代码
按一般情况来说 :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给一个实例定义一个新的实例变量。
class A
def initialize
@var1 = 1
end
def print_something
p @var1
p @var2
end
a1 = A.new
a2 = A.new
a2.instance_variable_set(:@var2,2)
a1.print_something
a2.print_something
复制代码
这是一个例子。
控制台因该会出现
1
nil
1
2
复制代码
这样。
然后关于:boat,其实这个是一个Symbol类的实例。使用":名称"的格式生成的Symbol,只要“名称”的部分相同,那么他就一定是同一个实例。一般用来进行判定,有的时候也可以用来代替判定用的字符串。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1