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

Project1

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

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
104
在线时间
93 小时
注册时间
2008-8-11
帖子
209
跳转到指定楼层
1
发表于 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
复制代码
头像被屏蔽

Lv2.观梦者 (禁止发言)

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

开拓者

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
104
在线时间
93 小时
注册时间
2008-8-11
帖子
209
3
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-1 12:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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