查看: 2697|回复: 5

[已经解决] 脚本中的self方法不能覆盖重写吗?

[复制链接]

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-9-7 14:42:01 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 喵呜喵5 于 2013-9-9 20:55 编辑

比如说,我想要修改

module BattleManager

中的self.gain_gold,于是在脚本的最后新建了一个脚本,内容为
  1. module BattleManager
  2.   def self.gain_gold
  3.     p "hello world"
  4.   end
  5. end
复制代码
实际运行游戏的时候却会报错“Stack Level Too Deep”堆栈过深

请问应该如何覆盖重写这些方法才不会出错?
梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
回帖
2257

贵宾

发表于 2013-9-7 14:49:05 | 显示全部楼层
本帖最后由 Sion 于 2013-9-7 14:51 编辑

你是不是在方法里又调用这个方法了。
alias 的话 用 class << BattleManager 里面的方法就是模块公共方法,不用写 self,可以像普通方法一样覆盖。
  1. class << BattleManager
  2.   alias_method :gain_gold_123345, :gain_gold
  3.   def gain_gold
  4.     gain_gold_123345
  5.   
  6.   end
  7. end
复制代码

评分

参与人数 1星屑 +45 收起 理由
喵呜喵5 + 45 认可答案

查看全部评分

回复

使用道具 举报

无节操

梦石
0
星屑
608
在线时间
795 小时
注册时间
2009-2-6
回帖
3910

开拓者贵宾

发表于 2013-9-9 20:20:14 | 显示全部楼层
self 是个缩写(专业名词俺不会装逼…),指代的是本类的一个实例
通常你会看到各种self.xxx ,其实就是针对一个本类的实例,调用本类中的xxx方法。而不是什么定义或者别的操作。定义一个方法,必须要“def”,这个省不得……

点评

moy
一开始没注意到沙发被认可了,看到我就不回帖了233  发表于 2013-9-9 21:00
moy
哦~那我没理解对问题所在~不过反正都解决了,无所谓了w  发表于 2013-9-9 20:59
啊,主楼确实忘打def了,不过只是帖子编辑时忘打了  发表于 2013-9-9 20:53
moy
module中是否是必须以self.xxx定义方法我也没有接触过,但看你主楼的。。起码你把def忘了  发表于 2013-9-9 20:21
Brandnew day, Brandnew Life
                             规 实在  中
暂为素材区版主,版其  琢磨
应援一下~
RPG制作大师授权素材推广计划
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

 楼主| 发表于 2013-9-9 20:32:34 来自手机 | 显示全部楼层
moy 发表于 2013-9-9 20:20
self 是个缩写(专业名词俺不会装逼…),指代的是本类的一个实例
通常你会看到各种self.xxx ,其实就是针对 ...

嗯,谢谢,不过我问的其实是

def self.abc
…
end

不是

def abc
…
end
def efg
self.abc
end

点评

6rp
这两个地方的self实际上是不一样的。上面的是类,下面的是实例。所以调用不到它。  发表于 2013-9-9 20:44
回复

使用道具 举报

梦石
0
星屑
50
在线时间
135 小时
注册时间
2013-6-10
回帖
28
发表于 2013-9-10 00:02:19 | 显示全部楼层
本帖最后由 xTsukihime 于 2013-9-10 00:03 编辑
喵呜喵5 发表于 2013-9-9 20:32
嗯,谢谢,不过我问的其实是

def self.abc


Sion 寫的

  1. class << BattleManager
  2.   alias_method :gain_gold_123345, :gain_gold
  3.   def gain_gold
  4.     gain_gold_123345
  5.   
  6.   end
  7. end
复制代码
也可以寫成

  1. module BattleManager

  2.   class << self
  3.     alias_method :gain_gold_123345, :gain_gold
  4.   end

  5.   def self.gain_gold
  6.     gain_gold_123345
  7.   end
  8. end
复制代码
我沒有看到“Stack Level Too Deep”的問題。
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

 楼主| 发表于 2013-9-10 00:30:43 | 显示全部楼层
xTsukihime 发表于 2013-9-10 00:02
Sion 寫的也可以寫成我沒有看到“Stack Level Too Deep”的問題。

谢谢,堆栈过深我是在没用<<直接覆盖时才发生的

顺便你的昵称看的我瞬间一震wwww
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部