Project1

标题: 请问各种插件中的alias为什么要加这个语句? [打印本页]

作者: 茶沫茶沫    时间: 2018-6-18 07:06
标题: 请问各种插件中的alias为什么要加这个语句?
alias是为方法取别名的语句,据说这样可以减少冲突,但是为什么这样取了个别名就可以防冲突呢?这里面的机制到底是什么?
求大佬解答orz
作者: 真·可乐    时间: 2018-6-18 09:25
本帖最后由 真·可乐 于 2018-6-18 09:30 编辑

我做一个ARPG游戏, 我想在Game_Event的update里添加判定死亡的方法,当HP为0时则判定死亡
直接新建一个脚本
  1. class Game_Event
  2.    def update
  3.     verifydeath #判定死亡的方法
  4.     end

  5. end
复制代码


这样写会脚本错误,因为Game_Event里的update被重写了,只执行verifydeath这个方法,原来的内容不会执行了
解决方法A:不新建脚本,直接在Game_Event的update里写上verifydeath
这个用于自己的工程完全可以,但是第三方插件就是要做到即插即用啊,怎么样在不修改原来的Game_Event的同时,在Game_Event的update里添加内容呢?
解决方法B:把原来的update内容全复制过来,再在其中写上verifydeath
  1. class Game_Event
  2.    def update
  3.        super
  4.        verifydeath #判断死亡的方法
  5.        # 自动启动事件判定
  6.        check_event_trigger_auto
  7.        # 并行处理有效的情况下
  8.            if @interpreter != nil
  9.              # 不在执行中的场合的情况下
  10.                   unless @interpreter.running?
  11.                   # 设置事件
  12.                  @interpreter.setup(@list, @event.id)
  13.                  end
  14.            # 更新解释器
  15.            @interpreter.update
  16.           end
  17.      end
  18. end
复制代码



如果只有一个插件要在Game_Event的update里添加内容的话,这种方法也是可以的。可是这明显很鸡肋
解决方法C:alias大法
  1. class Game_Event
  2. alias new_update update
  3.    def update
  4.     new_update
  5.     verifydeath #判定死亡的方法
  6.     end

  7. end
复制代码
给原来的update取别名叫new_update,new_update就包括原来update里的内容,再在新定义的update里加上new_update,这样在执行新定义update的时候原来的update的内容也可以执行了
说白了使用alias可以达成的效果是:在不改动原始脚本库的条件下,向原脚本库里的某个方法里添加内容






作者: 灯笼菜刀王    时间: 2018-6-18 10:16
本帖最后由 灯笼菜刀王 于 2018-6-18 10:20 编辑

因为如果直接def, 那就是后来者居上, 同样的方法, 后面的脚本会覆盖掉前面的, 一些热门地盘十分紧俏, 那就相当于用到这些热门地盘的插件就只能选择一个使用了, 你不会纠结么

但是用了alias就不一样,它相当于在热门地盘贴一块自己的专属方法上去, 不影响原本的方法, 这样,大家就不用抢地盘了,需要在原来的方法上加上自己的东西,就alias贴一块上去, 各自用各自的专属地盘。这样不是很和谐了么~

除非撞大运碰到两个重定义还是用一样的名字(你们可以结婚去了)

但是alias 多了不利于脚本修改和除错,所以如果自己用的话,还是直接整合到一个def里比较好。
作者: shitake    时间: 2018-6-18 19:14
单独的 alias 从来都没有防止冲突的意思

作者: fux2    时间: 2018-6-19 10:55
一种可以调用现同名方法的手段,也算是避免和其他部分脚本产生冲突吧。
作者: 茶沫茶沫    时间: 2018-6-19 18:16
真·可乐 发表于 2018-6-18 09:25
我做一个ARPG游戏, 我想在Game_Event的update里添加判定死亡的方法,当HP为0时则判定死亡
直接新建一个脚 ...

好像懂了!谢谢!
作者: 茶沫茶沫    时间: 2018-6-19 18:17
灯笼菜刀王 发表于 2018-6-18 10:16
因为如果直接def, 那就是后来者居上, 同样的方法, 后面的脚本会覆盖掉前面的, 一些热门地盘十分紧俏, 那就 ...

好的谢谢大佬!
作者: 茶沫茶沫    时间: 2018-6-19 18:18
fux2 发表于 2018-6-19 10:55
一种可以调用现同名方法的手段,也算是避免和其他部分脚本产生冲突吧。

SOGA!




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