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

Project1

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

[已经过期] 默认方法名 后面2个方法名 如何用 alias

[复制链接]

Lv2.观梦者

梦石
0
星屑
575
在线时间
1752 小时
注册时间
2008-11-7
帖子
1431
跳转到指定楼层
1
发表于 2013-6-25 11:06:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 z2z4 于 2013-6-25 11:53 编辑

比如 默认的 方法名 def make_damage_value(user, item)


                   后面  def make_damage_value(user, item)
              在后面   def make_damage_value(user, item)    当然这个是最终的

那如何利用 alias  别让 后面2个 互相 冲突

RUBY 代码复制
  1. def apply_critical(damage, item)
  2.     item.cri_damage ? damage * item.cri_damage.truncate : damage * 3
  3.   end
       貌似这个做了定义

RUBY 代码复制
  1. def make_damage_value(user, item)
  2.     value = item.damage.eval(user, self, $game_variables)
  3.     value *= item_element_rate(user, item)
  4.     value *= pdr if item.physical?
  5.     value *= mdr if item.magical?
  6.     value *= rec if item.damage.recover?
  7.     value = apply_critical(value, item) if @result.critical
  8.     value = apply_variance(value, item.damage.variance)
  9.     value = apply_guard(value)
  10.     @result.make_damage(value.to_i, item)
  11.   end


=======================================================
RUBY 代码复制
  1. def make_damage_value(user, item)
  2.     value = item.damage.eval(user, self, $game_variables)
  3.  
  4.     value = apply_reverse_heel(value, item)
  5.  
  6.     value *= item_element_rate(user, item)
  7.     value *= pdr if item.physical?
  8.     value *= mdr if item.magical?
  9.     value *= rec if item.damage.recover?
  10.     value = apply_critical(value) if @result.critical
  11.     value = apply_counter_gain(user, value, item) if user.actor_add_cheack[24]
  12.     value = apply_variance(value, item.damage.variance)
  13.     value = apply_guard(value)
  14.  
  15.     value = apply_defense_wall(value, item)
  16.     value = apply_invalidate_wall(value, item)
  17.     value = apply_metalbody(value, item)
  18.     value = apply_goldconvert(value, item)
  19.     value = apply_mpconvert(value, item)
  20.     value = apply_stand(value, item)
  21.     @result.make_damage(value.to_i, item)
  22.   end
RPG魔塔:http://rpg.blue/thread-254429-1-1.html
魔塔2:http://rpg.blue/thread-303601-1-1.html
魔塔3: 制作中...MV

Lv3.寻梦者

梦石
0
星屑
1165
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

2
发表于 2013-6-25 11:47:09 | 只看该作者
你想表达什么呢?似乎没太明白,我猜测的是:要分两次向make_damage_value添加内容。无论怎么说,按照下面这个方法都是没错的:

  1. #第一次补丁
  2. class X #<-你的类的名称
  3.   alias make_damage_value_patch1 make_damage_value
  4.   def make_damage_value(user, item)
  5.     make_damage_value_patch1(user, item)
  6.     # your code here
  7.   end
  8. end

  9. # 第二次补丁
  10. class X #<-你的类的名称
  11.   alias make_damage_value_patch2 make_damage_value
  12.   def make_damage_value(user, item)
  13.     make_damage_value_patch2(user, item)
  14.     # your code here
  15.   end
  16. end
复制代码
关于alias,可以参考这里:http://rpg.blue/thread-307096-1-1.html

点评

反正 就会出错  发表于 2013-6-25 11:54
后者直接就把前者覆盖了,何来冲突之说?  发表于 2013-6-25 11:52
我已经发到首页了  发表于 2013-6-25 11:50
你冲突很可能是两次定义的别名都一致。  发表于 2013-6-25 11:50
那你说详细一点啊。  发表于 2013-6-25 11:49

评分

参与人数 1星屑 +100 收起 理由
Sion + 100 感谢帮忙

查看全部评分


See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
575
在线时间
1752 小时
注册时间
2008-11-7
帖子
1431
3
 楼主| 发表于 2013-6-25 11:55:34 | 只看该作者
DeathKing 发表于 2013-6-25 11:47
你想表达什么呢?似乎没太明白,我猜测的是:要分两次向make_damage_value添加内容。无论怎么说,按照下面 ...

我想把 这2个方法名 都保留 别让覆盖 要怎么做
RPG魔塔:http://rpg.blue/thread-254429-1-1.html
魔塔2:http://rpg.blue/thread-303601-1-1.html
魔塔3: 制作中...MV
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1165
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

4
发表于 2013-6-25 12:01:07 | 只看该作者
z2z4 发表于 2013-6-25 11:55
我想把 这2个方法名 都保留 别让覆盖 要怎么做

解决方法那不正是我2#给出的代码么?

点评

你这个……总是没提供完整的信息啊……  发表于 2013-6-25 12:16
默认 脚本 def make_damage_value(user, item) 这个出现错误 我开始也是这样  发表于 2013-6-25 12:09
就是你的代码。用你的代码替换这行就行了。  发表于 2013-6-25 12:07
你说的是这句? # your code here 没看懂 这句是干嘛的  发表于 2013-6-25 12:02

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

5
发表于 2013-6-25 12:17:53 | 只看该作者
本帖最后由 Sion 于 2013-6-25 12:19 编辑

alias 本来就是为了覆盖原来的方法才使用的,一般是给原有的方法添加新功能。
你如果要调用原来的方法,就调用新的方法名。
然后你能告诉我为什么一定要 alias 两次吗 - -b

点评

给原来的方法 增加新功能 用2次 alias 没错啊 因为默认 1个 后面还有2个脚本 不就是用2个了吗  发表于 2013-6-25 12:20
用2次 这个alias 我也觉得奇怪  发表于 2013-6-25 12:19
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

6
发表于 2013-6-25 12:31:12 | 只看该作者
本帖最后由 Sion 于 2013-6-25 12:44 编辑
  1. def method1
  2.   '方法1'
  3. end

  4. alias method2 method1# 为 method1 起一个别名 method2 。目前为止,method1、method2拥有一样的功能

  5. def method1 #而 现在 method1 被重新定义。
  6.   '新' + method2
  7. end
  8. p method1 # => '新方法1''
  9. p method2 #=> '方法1'
复制代码
#以上代码相当于
  1. def method2
  2.   '方法1'
  3. end
  4. def method1
  5.   '新' + method2
  6. end

  7. p method1 # => '新方法1''
  8. p method2 #=> '方法1'
复制代码

点评

你要用2个方法,就写2个;要用一个,就只写一个,很简单。你现在这个,我不知道你到底要干嘛。  发表于 2013-6-25 13:29
怎样说 这2个方法 只能用1个了 不然就会 有问题  发表于 2013-6-25 13:18
如果你有条件直接修改原方法,alias 是没必要使用的。  发表于 2013-6-25 12:50
这只是一个例子,默认的方法跟这个是一样的道理。  发表于 2013-6-25 12:46
你这个写法 是包括 默认的方法吗  发表于 2013-6-25 12:44
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
64 小时
注册时间
2013-6-6
帖子
66
7
发表于 2013-6-25 12:50:45 | 只看该作者
施主,重命名的话,大多情况下后者会覆盖前者的。所以别想着保留两个一样名字的。alias的实质,就是将后者的定义内容完全复制给前者。
  1. def A
  2.   A = 0
  3. end
  4. alias B A  (alias:B:A)#alias 新名字 旧名称 OR alias: 新名字:旧名称
复制代码
结果将会相当于:
  1. def B
  2. A = 0 #(A原内容)
  3. end
复制代码
假如要加入新定义的A,可以这样操作:
  1. alias B A
  2. def A
  3. B  #(A原内容)
  4. B = 1 #新内容
  5. end
复制代码
这样的结果,就是将原来的A通过B重新加进A,而再加入新内容,这时候的A已经不是原来的A了。就成了原来的A+新代码。
实际上相当于
  1. def A
  2. A = 0  #(A原内容)  #是将A赋给B,B再赋回A,和原来一样,可是又不同。
  3. B = 1 #新内容
  4. end
复制代码
这样做的好处就是假如再加入“新的”A,产生冲突的可能性会少很多。假如要加入“新的”A,
  1. def A
  2. A_1 = 1
  3. end
复制代码
如果直接当作插件插到后面,会直接把原来内容(A = 0)覆盖掉,原来的A=0和新内容就直接没了,被覆盖了。
最后的A的内容就是上面所示的功能,可是如果用alias的话,就可以无冲突插入:
  1. alias C A #这个随便起,符合规范就是了#alias 新名字 旧名称
  2. #此时C的内容相当于上面的 A = 0 ; B = 1
  3. def A
  4. C
  5. A_1 = 1
  6. end


复制代码
这个时候的A就相当于:
  1. def
  2. A = 0
  3. B = 1
  4. A_1 = 1
  5. end
复制代码
而不是直接被覆盖。不知道明白了没……

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
64 小时
注册时间
2013-6-6
帖子
66
8
发表于 2013-6-25 13:01:21 | 只看该作者
本帖最后由 圆寂丨不羁的风 于 2013-6-25 13:04 编辑

由于没见到make_damage_value(user, item) 的关于user和item相关的用法, 只好推测是这样了:假如施主后面两个ruby代码是互相独立的脚本,而第一个是放在上面的老定义,就不用改了。这种情况下,下面的代码改为:
  1.   
  2. alias  make_damage_value_new(user, item) make_damage_value(user, item)
  3. #前面新名字随便改,别重复就是了,但记得变量(,)的内容要保持一致。
  4. #这里贫道也没底。没改过带复杂函数的,注,下文带#的,若有备份可以直接删去。
  5. #实际上要做的就是把重复内容去掉,然后作为一个新内容加进去。
  6. def make_damage_value(user, item)
  7.       make_damage_value_new(user, item)
  8. #   value = item.damage.eval(user, self, $game_variables)
  9.       value = apply_reverse_heel(value, item)   
  10. #   value *= item_element_rate(user, item)
  11. #   value *= pdr if item.physical?
  12. #   value *= mdr if item.magical?
  13. #    value *= rec if item.damage.recover?
  14. #    value = apply_critical(value) if @result.critical
  15.     value = apply_counter_gain(user, value, item) if user.actor_add_cheack[24]
  16. #    value = apply_variance(value, item.damage.variance)
  17. #    value = apply_guard(value)
  18.    
  19.     value = apply_defense_wall(value, item)
  20.     value = apply_invalidate_wall(value, item)
  21.     value = apply_metalbody(value, item)
  22.     value = apply_goldconvert(value, item)
  23.     value = apply_mpconvert(value, item)
  24.     value = apply_stand(value, item)
  25.     @result.make_damage(value.to_i, item)  #这句不知道要不要一定放最后,试试用#注释它,不行的话注释前面的脚本。
  26.   end
复制代码

点评

刚刚 也按你这个写发 和之前 没改前 效果一样  发表于 2013-6-25 13:16
02.alias make_damage_value_new(user, item) make_damage_value(user, item) 这句不能这样写 不然出错  发表于 2013-6-25 13:15

评分

参与人数 1星屑 +100 收起 理由
Sion + 100 感谢帮忙

查看全部评分

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
575
在线时间
1752 小时
注册时间
2008-11-7
帖子
1431
9
 楼主| 发表于 2013-6-25 13:04:46 | 只看该作者
A因为 我自己 有一套 很强大的脚本 里面包括很多的  然后 我又加个 B技能暴击伤害和暴击率的设置 这个是独立的  这样堆 技能暴击伤害 是控制住了 蛋暴击率没法控制 设置1 他依然 会有100%的几率 我把他放到 A脚本的前面 A的脚本  就开始出错了

点评

反正 alias 不是你想用,想用就能用 :>  发表于 2013-6-25 13:13
因为 make_damage_value 都有定义过 所有我想利用alias  发表于 2013-6-25 13:08
RPG魔塔:http://rpg.blue/thread-254429-1-1.html
魔塔2:http://rpg.blue/thread-303601-1-1.html
魔塔3: 制作中...MV
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
64 小时
注册时间
2013-6-6
帖子
66
10
发表于 2013-6-25 13:18:30 | 只看该作者
z2z4 发表于 2013-6-25 13:04
A因为 我自己 有一套 很强大的脚本 里面包括很多的  然后 我又加个 B技能暴击伤害和暴击率的设置 这个是独 ...

  其实呢……发现事实上后者的内容几乎涵盖了前者,试试直接删掉前者(在前者头加个左对齐顶格的=begin尾加个=end)………………

点评

效果理论上是一样的……这样子的话那就得改代码了。估计是有些地方计算出了问题。贫道就帮不到你了……贫道虽说有点编程基础,但是数学渣的.....  发表于 2013-6-25 20:50
我全注释了 放到了前面 可以用 但暴击率 没法控制 写1 依然有100%的效果  发表于 2013-6-25 13:26
先试试。不行再说,或者直接用后文的覆盖前面的,后面的删掉……施主看看,实际上前文有的后文都有……  发表于 2013-6-25 13:22
把前者删了 那这个 效果不就没了 - - 这个定义了 很多地方的 可能会引起很多地方的 错误  发表于 2013-6-25 13:20
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-2 04:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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