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

Project1

 找回密码
 注册会员
搜索
查看: 139|回复: 6

[已经解决] 用alias扩充方法之后遇到的奇怪错误

[复制链接]

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
104
在线时间
93 小时
注册时间
2008-8-11
帖子
209
发表于 2018-12-12 01:04:02 | 显示全部楼层 |阅读模式

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

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

x
初学RGSS,偶然遇到了一个无限递归的错误。
感觉按照正常逻辑来看是根本不会发生递归的,希望大佬们能够帮我解惑。
简化出来的代码如下:
  1. class A_Test
  2.   def test
  3.     print('A')
  4.   end
  5. end

  6. class B_Test < A_Test
  7.   def test
  8.     print('B')
  9.     super
  10.   end
  11. end

  12. class A_Test
  13.   alias base_test test
  14.   def test
  15.     print('newA')
  16.     base_test
  17.   end
  18. end


  19. class B_Test
  20.   alias base_test test
  21.   def test
  22.     print('newB')
  23.     base_test
  24.   end
  25. end

  26. b = B_Test.new

  27. b.test
复制代码
头像被屏蔽

[动态]受到SailCat的挑战,被揍得晕头转向。 (打开TA的战斗卡片)

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

发表于 2018-12-12 02:39:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 1 反对 0

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
104
在线时间
93 小时
注册时间
2008-8-11
帖子
209
 楼主| 发表于 2018-12-12 21:56:18 | 显示全部楼层
晴兰 发表于 2018-12-12 02:39
简单说 A的test方法里面的base_test那句调用的是对象上的base_test
如果你用b去调用,那么实际上是通过B的t ...

明白了,那么是否有方法去避免调用到B的base_test呢

点评

说到底这是后写的B带来的锅,不应该改A  发表于 2018-12-13 02:53
因为本来就是A的方法,还要对运行环境说请使用A#base_test,这可能是个设计问题  发表于 2018-12-13 02:52
你还可以强制: A.instance_method(:base_test).bind(self).call替换那句。虽然看起来有点别扭  发表于 2018-12-13 02:52
简单的方法就是不要重名,base_test_1、base_test_2等等  发表于 2018-12-12 23:17
回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-5-22 12:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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