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

Project1

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

[已经解决] 关于一个符号问题

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-10-28
帖子
58
跳转到指定楼层
1
发表于 2009-11-7 05:46:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

Lv1.梦旅人

℃ake

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-6-6
帖子
787
2
发表于 2009-11-7 05:52:08 | 只看该作者
本帖最后由 奶油Da蛋糕 于 2009-11-7 09:12 编辑
这个符号可以用来调用某个类中的嵌套(nested)类。
嵌套类的定义:可以把类放入其它的类之中。如果某个类依赖于其他类,而这些其它类仅在此处有用,在其它地方无用,在这样的情况下,可以使用嵌套类。

举个简单的例子。
  1. class ABC
  2. class DEF
  3. def self.G
  4. return 'a'
  5. end
  6. end
  7. end
复制代码
这样的话你输入
  1. print ABC::DEF.G
复制代码
试试效果?
如果窗口中弹出了"a",那么恭喜你!

其中的符号::就是调用了class ABC中的class DEF,由于这是嵌套类,所以在外面不能直接调用,需要用符号::分隔各个嵌套的类完整地把各个类表示出来。

嵌套类与普通类的定义方法完全相同,但用法不同。
再举一个嵌套类的例子。
  1. class Cake
  2. def self.give_me_a_cake
  3. Cream_cake.new.give_me_a_cake
  4. end
  5. class Cream_cake
  6. def give_me_a_cake
  7. print "This is a cream cake"
  8. end
  9. end
  10. class Water_cake
  11. def give_me_a_cake
  12. print "This is a water cake"
  13. end
  14. end
  15. end
复制代码
在Cake类中,输入
  1. Cream_cake.new.give_me_a_cake
复制代码
可以直接转入class Cake中嵌套的class Cream_cake。但是在Cake类之外,就只能使用Cake::Cream_Cake或Cake::Water_Cake的形式访问class Cream_cake和Water_cake。
如:
  1. Cake.give_me_a_cake
  2. #=>"This is a cream cake"
  3. Cream_cake.new.give_me_a_cake
  4. #=>NameError
  5. Cake::Cream_cake.new.give_me_a_cake
  6. #=>"This is a cream cake"
  7. Cake::Water_cake.new.give_me_a_cake
  8. #=>"This is a water cake"
复制代码
好了,再回到楼主所说的问题。
楼主所说的RPG::sth.中的RPG是RGSS中的一个内部模块(module)与例子中的class有细微的区别(由于楼主的问题并不是module和class的区别,这里不详细介绍,楼主暂时把module当作一个没有initialize的特殊class就可以了)。

module RPG中的内容可以在F1帮助文档中找到。

这是其中的一段比较短的内容。
  1. module RPG
  2.   class Troop
  3.     def initialize
  4.       @id = 0
  5.       @name = ""
  6.       @members = []
  7.       @pages = [RPG::BattleEventPage.new]
  8.     end
  9.     attr_accessor :id
  10.     attr_accessor :name
  11.     attr_accessor :members
  12.     attr_accessor :pages
  13.   end
  14. end
复制代码
比如这一段脚本,想要调用其中的Troop中的initialize应该如何调用呢?
(这里当做一个考题留给楼主,楼主可以通过我前面给的例子找到答案)

好了,就讲到这里,希望能够帮助你理解吧。
我爱66RPG,但我讨厌66.
回复 支持 反对

使用道具 举报

Lv2.观梦者

永遠神剣

梦石
0
星屑
339
在线时间
412 小时
注册时间
2009-8-16
帖子
1797

贵宾

3
发表于 2009-11-7 06:17:41 | 只看该作者
常用在外部模块的调用吧.
一般就是多数的外挂脚本的设置项目里设置好了然后 使用『模块名::常量名』在类里使用模块里事先定义好的参数吧
新的UI 旧的开始
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
4
发表于 2009-11-7 08:56:22 | 只看该作者
这个符号的标准名称是作用域运算符,用于修饰常量,让常量能够引用到另一个名字空间中去,同时也合理地分配了不同域中的名字问题,避免了重名等现象~由于类名本身也是常量,所以也能通过 :: 来修饰其所属的名字空间……

一个经典的例子:一班和二班都有一个人叫张三,学校活动的时候为了消除歧义,在引用一班的张三时用“一班”来修饰张三的名字,在引用二班的张三时用“二班”来修饰张三的名字,这样一来人名就各有所指,且所属分明了
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-10-28
帖子
58
5
 楼主| 发表于 2009-11-7 12:33:35 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

℃ake

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-6-6
帖子
787
6
发表于 2009-11-7 12:51:23 | 只看该作者
本帖最后由 奶油Da蛋糕 于 2009-11-7 12:56 编辑
谢谢蛋糕大大的热心解答和楼上几位前辈的解答.现在貌似懂一点点了.但关于蛋糕第二
部分的教程还是不太理解.还有就是把第二部分放到脚本编辑器后会出现"uninitialize
d constant for Cream_Cake."

还有这句不太懂:
@ ...
蓝色水晶 发表于 2009-11-7 12:33


呼呼,说了那么多你还是没有理解。
  1. class Cake
  2. def self.give_me_a_cake
  3. Cream_cake.new.give_me_a_cake
  4. end
  5. class Cream_cake
  6. def give_me_a_cake
  7. print "This is a cream cake"
  8. end
  9. end
  10. class Water_cake
  11. def give_me_a_cake
  12. print "This is a water cake"
  13. end
  14. end
  15. end
复制代码
在Cake类中调用
  1. Cream_cake.new.give_me_a_cake
复制代码
可以成功,在Cake类外面调用自然就NameError了。
所以在Cake类外面调用嵌套类需要用
  1. Cake::Cream_cake.new.give_me_a_cake
复制代码
才能调用。也就是你说的两个冒号。也就是紫苏所说的作用域运算符

然后,再回到这里。
  1. @pages = [RPG::BattleEventPage.new]
复制代码
是生成了一个名为@pages的对象,里面调用了RPG模块中的class BattleEventPage的initialize方法。
大概就是这样
  1. module RPG
  2. class BattleEventPage
  3. def initialize
  4. #>=里面放着很多很多的东西
  5. end
  6. end
  7. end
复制代码
这一句就是调用里面放着的很多很多的东西。
我爱66RPG,但我讨厌66.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-10-28
帖子
58
7
 楼主| 发表于 2009-11-7 13:36:41 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

8
发表于 2009-11-7 20:47:14 | 只看该作者
本帖最后由 link006007 于 2009-11-7 20:51 编辑

类似 命名空间 这样的概念(C++里这么叫,ruby也这么叫。类似Java的包)
至于 名空间, 可以在google或baidu找到其相关定义和例子。
简单说来就是: 主要为了解决命名冲突的问题
例如有两个人都叫K,我们在叫他们时经常会加些其它称谓,如年龄大的叫老K,小的小K之类的
那么那些老,小,分别就是这两个K的命名空间。
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6865
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

9
发表于 2009-11-7 21:43:38 | 只看该作者
@pages = [RPG::BattleEventPage.new]
这一行是先生成了一个数组
然后是生成了一个RPG::BattleEventPage类的实例对象
再然后是这个数组的0单元被赋值成了这个实例对象
最后 实例变量 @pages 被赋值为了这个数组
我们创建一个新的数组可以用数组类的new方法  Array.new
也可以直接用 []  来创建一个数组
这个 .new 方法是开辟一块内存空间创建实例对象并自动调用 initialize 方法
而 initialize 方法是无法在外部调用的
比如
a = RPG::Actor.new
a.initialize
这个时候就会报告错误

关于 :: 这个符号其实楼上几位已经说得很清楚了
我再说说吧
在RMXP里 有一个类叫  Sprite
但是在模块RPG里也有一个类叫 Sprite
这2个类并不是指的同一个类
但是我要得到这2个类的实例对象应该怎么办
a = Sprite.new
b = RPG::Sprite.new
第一行Sprite.new得到的是模块RPG外部的Sprite类的对象
而第二行得到的是模块RPG内部的Sprite类的对象

其实脚本并不是那么难的.就看你是否明白【对象】为何物以及方法的调用.方法的返回值
这样就够了.太高深的东西做游戏也不怎么用得上











你知道得太多了

回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-10-28
帖子
58
10
 楼主| 发表于 2009-11-8 01:53:06 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-28 03:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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