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

Project1

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

[有事请教] 用alias扩充方法之后遇到的奇怪错误

[复制链接]

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
复制代码

Lv2.观梦者

梦石
0
星屑
459
在线时间
3739 小时
注册时间
2011-2-26
帖子
1836

开拓者

发表于 2018-12-12 02:39:36 | 显示全部楼层
简单说 A的test方法里面的base_test那句调用的是对象上的base_test
如果你用b去调用,那么实际上是通过B的test调用了B的base_test的super调用了A的test
这样的话A的test就会继续调用B的base_test

评分

参与人数 1+1 收起 理由
451483807 + 1

查看全部评分

RML正在开发中
项目: https://github.com/RGSS3/PML
发布: http://seiran.mist.so/rml/rml.html
应援: https://afdian.net/@seiran
回复 支持 1 反对 0

使用道具 举报

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-1-19 19:59

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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