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

Project1

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

[RMVX发布] 新手教程——module(模块)的函数传递和类的定义运算符_(9)

[复制链接]

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4804
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
跳转到指定楼层
1
发表于 2011-4-21 12:12:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 一箭烂YiJL 于 2011-4-21 15:08 编辑


若想从头学习的同学点此:
第一课、新手教程——基础(YiJL脚本请从此课开始)
课序号:9
作者:一箭烂YiJL
出版社:VX教程出版社
售价:完全免费
VX教程出版社的其它教程

上一课:
super的作用和外界调用类中函数_(8)

序:
很久都没发了,都是因为冷清呢!(不要再讨论这个了= =)。
这一课我要说的是module(模块)的函数(方法)传递,和类的运算符。

正式开始:
我们要让module里定义一个方法,然后用"."符号来传递。
还有要定义一个类的运算符,(包括模块)
C++用"operator 运算符"的方法来定义,那么Ruby又怎么样的呢?

A.module的方法传递

先做一个小实验:
  1. module A
  2.   def tell_5
  3.     p 5
  4.   end
  5. end
  6. A.tell_5     # NoMethodError(失败)
复制代码
这是因为模块的构造很独特,简单的办法:
  1. module A
  2.   def self.tell_5
  3.     p 5
  4.   end
  5. end
  6. A.tell_5     # => 5
复制代码
这样就见成效了。self是伪变量,意思是假名/代替词。
那么定义self.tell_a,外界就能用A.tell_a。(self-->A)
其实这样也行:
  1. module A
  2.   def A.tell_5
  3.     p 5
  4.   end
  5. end
  6. A.tell_5     # => 5
复制代码
那么这样呢:
  1. module A
  2. end

  3. def A.tell_5
  4.   p 5
  5. end

  6. A.tell_5     #依然可以 => 5

复制代码
但是这样不行:
  1. def A.tell_5
  2.   p 5
  3. end

  4. A.tell_5     # Error
复制代码
因为A根本就没定义是啥。

除了这一种外,还有两种办法,但有好处有公开实例变量、alias...(<=这些还没教)所以先不教。



B.运算符的定义

当你想将两个不同/相同的类(class)加、减、乘...(运算起来),
但是他们又不是数字类,但又想将其的某些(实例)变量加起来。

先学个有关的:
  1. class XXX
  2.   
  3.   # 初始化
  4.   def initialize
  5.     @abc = 5
  6.   end
  7.   
  8.   # 修改abc量
  9.   def abc=(value)
  10.     @abc = value
  11.   end
  12.   
  13.   # 返回abc的量
  14.   def abc
  15.     return @abc
  16.   end
  17. end

  18. cc = XXX.new  # .new与initialize相连
  19. p cc.abc      # => 5
  20. cc.abc = 60
  21. p cc.abc      # => 60
复制代码
这个只是最简单的"="号运算符的定义。


来个深奥点的:
  1. class XXX
  2.   
  3.   # 初始化
  4.   def initialize
  5.     @abc = 5
  6.   end
  7.   
  8.   # 返回加完后的abc量 (留意名字变动!)
  9.   def +(value)
  10.     return @abc + value
  11.   end
  12.   
  13. end

  14. cc = XXX.new  # .new与initialize相连
  15. p cc + 50     # => 55
  16. # 怎么不需要用"."来最为传递呢?
  17. # 这是定义运算符的特色,然而有"."也可以:
  18. p cc.+ 50     # => 55
复制代码
那么两个非数字类又怎么做:
  1. class XXX
  2.   
  3.   # 初始化
  4.   def initialize(value)   #(注意变动!)
  5.     @abc = value
  6.   end
  7.   
  8.   # 返回加完后的abc量
  9.   def +(value)
  10.     return @abc + value.abc   #(注意变动!)
  11.   end
  12.   
  13.   # 用于上面的value.abc的接收
  14.   def abc
  15.     return @abc
  16.   end
  17. end

  18. aa = XXX.new(5)   # aa里的@abc为5
  19. bb = XXX.new(8)   # bb里的@abc为8
  20. p aa + bb         # => 5 + 8 = 13
  21. # 关键就在"+value.abc", 所以需要"def abc"来接收这个数字
复制代码
那么不同的类呢?我们只需将".abc"改掉就可以,
不明白的看这里:
  1. class XXX
  2.   
  3.   # 初始化
  4.   def initialize   #(注意变动!)
  5.     @abc = 5
  6.   end
  7.   
  8.   # 返回加完后的abc量
  9.   def +(value)
  10.     return @abc + value.x   #(注意变动!)
  11.   end
  12. end

  13. aa = XXX.new
  14. bb = Rect.new(50, 0, 0, 0)
  15. p aa + bb         # => 5 + 50 = 55
  16. # aa只会加bb的.x, 所以用了"value.x"
  17. # 而bb是Rect(矩形类),其中.x 就是.new的第一个参数(50)
复制代码
好~下课!!!各位同学回个贴~
(反应:同学们都课间休息溜了去玩= =)

评分

参与人数 2星屑 +290 收起 理由
DeathKing + 266 D计划鼓励。
苏小脉 + 24

查看全部评分

Lv3.寻梦者

梦石
0
星屑
1239
在线时间
668 小时
注册时间
2009-11-11
帖子
2787
2
发表于 2011-4-21 14:35:03 | 只看该作者
self是类本身?顶吧,谢谢大人,研究研究

点评

是。(发现我漏写了= =不过整体意思还是差不多)  发表于 2011-4-21 14:38

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
790
在线时间
1666 小时
注册时间
2009-7-25
帖子
532

开拓者

3
发表于 2011-4-21 15:01:31 | 只看该作者
本帖最后由 烁灵 于 2011-4-21 15:27 编辑

回复 一箭烂YiJL 的帖子

防止看帖的新手们误解,编辑=w=

点评

嗯~是个笔误,谢谢提醒!(已修复,本来是tell_a的。)  发表于 2011-4-21 15:08
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1040
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

4
发表于 2011-4-22 23:52:42 | 只看该作者
Module 的引入初衷,是为了解决多继承问题。 Java 只能单继承,但是通过某种方法可以调和,而 Ruby 使用的混成(Mix-in)机制,就完美的解决了这个问题。

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
5
发表于 2011-4-23 08:53:26 | 只看该作者
DeathKing 发表于 2011-4-22 23:52
Module 的引入初衷,是为了解决多继承问题。 Java 只能单继承,但是通过某种方法可以调和,而 Ruby 使用的 ...

Module 同时也提供了一个命名空间。

Java 是类只有单继承,但接口可以多继承,也是解决了钻石问题。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1239
在线时间
668 小时
注册时间
2009-11-11
帖子
2787
6
发表于 2011-4-23 10:59:07 | 只看该作者
对对....,当初就觉得和VB命名空间很像...后来竟然忘了,现在才想起来,这样概念又不混淆了,
用  private 所有类都能引用

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1040
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

7
发表于 2011-4-23 12:59:33 | 只看该作者
回复 苏小脉 的帖子

对 Java 了解不深,不过似乎抽象类(abstract classes)和抽象方法可以被继承。

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
8
发表于 2011-4-24 03:12:23 | 只看该作者
DeathKing 发表于 2011-4-23 12:59
回复 苏小脉 的帖子

对 Java 了解不深,不过似乎抽象类(abstract classes)和抽象方法可以被继承。 ...

这句话和前文有联系吗?无论是否抽象类,只要是类,在 Java 中就只有单继承。但如果是接口,就可以多继承。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

醉啸 长风万里

梦石
0
星屑
6052
在线时间
6586 小时
注册时间
2007-12-16
帖子
4501

贵宾

9
发表于 2011-4-24 12:36:04 | 只看该作者
剑兰终于出新教程了,支持!

点评

那必须的  发表于 2011-4-24 14:54
我发的脚本已经比我写的教程多= =  发表于 2011-4-24 13:44

还在龟速填坑中
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
790
在线时间
1666 小时
注册时间
2009-7-25
帖子
532

开拓者

10
发表于 2011-4-24 12:56:17 | 只看该作者
(可以在这一贴请教么0。0


请教前辈
class <<Graphics
……
end

这是什么用法?我定义了一个类么0。0
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-21 00:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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