Project1

标题: 关于【模块】的相关问题 [打印本页]

作者: 后知后觉    时间: 2009-5-2 10:28
标题: 关于【模块】的相关问题
第一次接触【模块】
遇到一点点问题
新定义的一个模块里定义的一个方法
module HZHJ
  def h_fire
  end
end
这样定义以后在公共事件里的脚本调用 HZHJ.h_fire
会发生错误 说HZHJ module没有定义h_fire
这是为什么呢?
然后我重新写了下方法的定义
module HZHJ
  def HZHJ.h_fire
  end
end
这样写的话就没有出错了,这是为什么呢
模块本身也是一个对象,我第一次定义的为什么会出错呢?

作者: danny8376    时间: 2009-5-2 11:11
可以看看  RMXP技術版  的  秀秀之走火入魔的高级脚本教程
http://rpg.blue/viewthread.php?tid=108581
這裡有詳細說明

在Ruby中
(模組Moudle本身也是個類Class)
def xxxxx
均為對象"副本"的方法
所以無法直接調用
class xxx
  def self.xxx

def xxx.xxx
這些為類的方法
一定要直接調用



這種問題不是只有在模組中才會有
在類中也會有這種問題
moudle A
  def a
  end
  def self.b
  end
end
calss B
  def a
  end
  def self.b
  end
end

當調用
A.a # 報錯
A.b # 正常
同樣的
調用
B.a # 報錯
B.b # 正常
但是當
b = B.new
b.a # 正常
b.b # 報錯 [LINE]1,#dddddd[/LINE]版主对此帖的认可:『唉……』,积分『+500』。
作者: 紫苏    时间: 2009-5-2 12:11
楼上说的很正确,不过还是忍不住想补充下:
模块本身是一个抽象的数据结构,不是一个具体的对象~
这两种不同的方法定义方式其实就分别定义了静态方法和动态方法——
静态方法属于类/模块本身,在整个程序的生命周期中只会初始化一次,可以在不同的对象实例之间共享,所以可以通过类/模块名字空间直接引用;
动态方法属于类/模块的实例,每次建立一个新的对象时都会为其分配新的空间,所以又称为实例方法,需要通过一个实例才能引用~
模块的实例方法比较特殊,因为模块本身不可实例化,所以主要是用于模块和类的混入时,导入模块的实例方法供类使用的:
module A
   def aaa
     p 1
   end
end

class B
   include A    # B 类包含模块 A 的数据
end

B.new.aaa      # 通过 B 的实例调用 aaa 方法

为什么要分成静态和动态呢?
以上是抽象定义,可能不太好理解,举个形象点的例子吧~
有一个类叫 [Person],我们想给 Person,也就是人,添加一些基本的行为: [eat]、[sleep]、[cry]、[smile],但是张三、李四、其他每个人都有不同的吃法、睡法、哭法、笑法,并且这些行为直接影响的是他们自己~所以我们把这些行为都定义为实例方法,针对不同的人的实例(对象)都有一份属于实例自己的行为拷贝……

我们还想定义一个方法,这个方法描述人类是一种什么样的生物,但由于这里我们是针对“人”这个抽象的集合(人“类”),而不是针对某个人的实例,比如张三、李四,所以我们把这个描述人的方法定义为 [Person] 类的静态方法:
class Person
   def Person.description
     return "人,属于哺乳纲灵长目人科人属智人种。"
   end
end
之后直接通过“人”这个抽象概念来调用这个方法:
p "Q:人是一种什么动物?"
p "A:" + Person.description
[LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: 小lim    时间: 2009-5-2 15:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: 后知后觉    时间: 2009-5-4 03:07
哦哦,明白了!谢谢!
danny8376

紫苏

版主帮忙结下帖,谢谢了!
作者: 凌辰    时间: 2009-5-4 03:25
以下引用后知后觉于2009-5-3 19:07:26的发言:
版主帮忙结下帖,谢谢了!
为啥要我帮忙结贴- -
作者: 后知后觉    时间: 2009-5-4 03:49
我自己结帖不是只能认证一个人的答案的啊
那2位的回答都很好啊....
作者: 凌辰    时间: 2009-5-4 03:52
以下引用后知后觉于2009-5-3 19:49:15的发言:
我自己结帖不是只能认证一个人的答案的啊
那2位的回答都很好啊....
你就那么不舍得追加点积分啊?
看你也不是缺分的人啊- -

自己追点分,一个点部分认可,另一个点认可答案。
作者: 后知后觉    时间: 2009-5-4 04:03
这样的操作我没弄过- -!
反正认证了一个 另外一个就没有认证的按钮了
作者: 凌辰    时间: 2009-5-4 04:08
以下引用后知后觉于2009-5-3 20:03:15的发言:
这样的操作我没弄过- -!
反正认证了一个 另外一个就没有认证的按钮了
全部分数部分认可,你不追加分让系统追加啊?
作者: 后知后觉    时间: 2009-5-4 04:18
哎- -! 算了就这样吧
我没弄过那东西
现在已经没有那按钮了,
刚才打了分,点的是后面的确定...





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