Project1

标题: alias的用法(500分) [打印本页]

作者: 八云紫    时间: 2008-5-16 02:24
标题: alias的用法(500分)
   嘛,请问下达人们,alias的具体用法?
(PS:请不要引用XP帮助文档里对alias的说明,谢谢。)
(再PS:最好能针对VX来说明一下,再谢谢。)
[LINE]1,#dddddd[/LINE]

如果能说明一下这个脚本的含义就更好了:
    alias initialize_sideview initialize
  def initialize(viewport, battler = nil)
    initialize_sideview(viewport, battler)
    init_direct_attack
  end

[LINE]1,#dddddd[/LINE]
   说明一下下super与alias的区别。(废话真多,PAI飞)
[LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: 美兽    时间: 2008-5-16 02:28
似乎在占LZ的便宜??

http://rpg.blue/viewthread.php?t ... 5%2D15+18%3A27%3A33

http://rpg.blue/viewthread.php?t ... 5%2D15+18%3A28%3A36 [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: Beside    时间: 2008-5-16 02:41
alias就是追加定义!  
alias initialize_sideview initialize就是你不用重新定义initialize了
如果initialize很长 几十行的内容 那么你往里面添加内容的时候就得先全写一遍再加你的内容
这样写就几行 你可以补充想加的内容 别的脚本里调用initialize就达到了效果。
super是继承父类的定义!
Window_Base里有个initialize定义了坐标
那么Window_Menu < Window_Base 来个super 就套用了Window_Base里的initialize
貌似500分没悬念了== [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: 八云紫    时间: 2008-5-16 02:57
alias 的用法到是明白了。

可是super和alias的还是区分不开来。
作者: yangff    时间: 2008-5-16 03:04
一个是在后面追加,一个是调用父类同名方法
比如:
def apple
p hello
end
alias apple2 apple
def apple
apple2
p "teacher."
end
那apple就是
p "teacher."
p hello
而super则
def a
def init
  p apple
end
end
def b < a
def init
  p a
  super()
end
end
那么b为
p a
p apple
作者: sizz123    时间: 2008-5-16 03:14
起别名,alias用在添加脚本上
作者: 沉影不器    时间: 2008-5-16 04:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-5-16 06:09
很多高手回答了

所以我飘过{/hx}
作者: wy29    时间: 2008-5-16 06:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-5-16 06:29
沒有超類用不了 super
沒有先定義用不了 alias
super 是上承父類同名方法
alias 是轉接先定義方法
用途兩者可以說是一模一樣,只是用法有差異

super 的同名方法是在super class 層次
alias 的同名方法是在同一個 class 層次

實際上兩者的區別只是調用不同位置的頭文件

就醬紫
作者: 雪流星    时间: 2008-5-16 07:11
我写个例子给你吧:

  1. class Window_Base < Window
  2.   def initialize(某参数)
  3.     #内容
  4.   end
  5. end

  6. class Window_Status < Window_Base
  7.   def initialize(某参数)
  8.     super(某参数) # 执行Window_Base 的 initialize
  9.   end
  10.   def refresh
  11.     # 执行刷新部分1
  12.   end
  13.   alias refresh2 refresh
  14.   def refresh
  15.     refresh2  # 执行刷新部分1
  16.     # 执行刷新部分2
  17.   end
  18. end
复制代码

作者: 八云紫    时间: 2008-5-16 16:49
恩恩,基本上明白了。谢谢大家。
作者: Beside    时间: 2008-5-16 18:08
此贴甚好...高手云集啊(我可不是= =){/hx}
作者: 沉影不器    时间: 2008-5-16 18:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: 禾西    时间: 2008-5-16 20:07
以下引用沉影不器于2008-5-16 10:47:22的发言:

本来想说alias用来减少代码无意义的...后来忍了

爲啥忍了?
我知道 alias 雖然很好用,但是 alias 以後會增加內存消耗...有厲有弊...
作者: 八云紫    时间: 2008-5-16 20:09
对alias的工作原理很表示怀疑,为什么旧方法改变,新方法还可以具有旧方法的特性。
作者: 禾西    时间: 2008-5-16 20:17
道理啊?就是這個道理啊
a = 1
b = a.clone
a = 2
p a + b #=> 3

ruby 裏面的方法是用 symbol 記載的的
alias 就等於克隆一份副本,然後換一個 symbol 記載方法,再接著在新方法當中被重新調用。甚麽具有新特性的是假的,最好舊方法可以不帶參數被調用|||
[LINE]1,#dddddd[/LINE]
直接打飛樓下
作者: wy29    时间: 2008-5-16 20:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: 八云紫    时间: 2008-5-16 20:26
话说,能节约旧尽量节约,内存是很宝贵的。

不过不太喜欢用 alisa
作者: 雪流星    时间: 2008-5-16 20:29
以下引用wy29于2008-5-16 12:19:35的发言:

禾西,你也太吝啬了。
连alias用的內存也计较?
又不是在micro-controller或FPGA上编程序。
而且现在电脑内存最低512MB,一般人都1GB到2GB。
占几个bit的alias能吃多少呢?

再说,Ruby里有什么东西不占内存?
好像alias占的内存不比重定义一个method多?

实在是个吝啬鬼。

呵呵,你不能怪他
禾西写了一个脚本
但是卡的要死
所以........
作者: link006007    时间: 2008-5-16 20:41
alias 创建一个新的函数  基于原来函数的拷贝
alias name def # 设 name def 方法名
其实就是函数连接
ruby会根据提供的函数名找到该函数(该过程会判断函数是模块还是类还是单一的)
  orig = search_method(xxx, def, xxx)
ruby函数(orig)是一个结构体, 包含着函数的函数体(nd_body),函数段个数(nd_cnt)和连接规则
设置nd_body属性(应该是指向一个ruby函数的各个函数段)
    body = orig->nd_body;
    orig->nd_cnt++;
    if (nd_type(body) == NODE_FBODY) { /* was alias */
        def = body->nd_mid;
        origin = body->nd_orig;
        body = body->nd_head;
    }
最后进行测试, 然后插入类的函数表中

以上只是个人YY, 有兴趣自己去看源码 = =
作者: link006007    时间: 2008-5-16 20:45
函数本来就会占用内存, alias感觉上只是为了保留原方法而存在的
作者: 八云紫    时间: 2008-5-16 20:46
就是说使用 alias 后,调用这个方法的时候,实际上调用的是旧的方法?
作者: wy29    时间: 2008-5-16 20:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: link006007    时间: 2008-5-16 21:03
也不能算旧吧  毕竟还是变了
我只是把调用ruby函数想成顺序遍历链表(不知对不对... ...),
也就是每次的函数调用都是同一个入口
每一次alias就好像在链表某些位置插入了新元素
于是你每次遍历同一个链表时, 就可以得到最新的结果
以下引用八云紫于2008-5-16 12:09:53的发言:
对alias的工作原理很表示怀疑,为什么旧方法改变,新方法还可以具有旧方法的特性。

旧方法好比原先就存在的元素

PS  当心内存, 不如控制好自己的类结构和程序流程
作者: 禾西    时间: 2008-5-16 21:27
引發 SystemStackError
def a
  p 1
end

alias b a
def a
   b
end

alias b a
def a
   b
end

a

exit

作者: link006007    时间: 2008-5-16 21:51
def a       # e
p 1              
end

alias b a    # 节点 b
def a
  b
end

alias b a   # 节点 c
def a
  b
end
相当于 链表头节为a , ze此时a->c->b 而b->c alias 又是同名 相当于 a->c->b->b
b 和 b 死循环  无法指到e
就和
def a
  a
end   一样  无限递归   



作者: zlink    时间: 2008-5-16 22:30
大好蹲监狱了  只好过来补一下(刚好够100积分- -)
link006007 说的纯属YY, 有意者请自行阅读源代码, 莫要被误导
作者: 沉影不器    时间: 2008-5-17 06:30
提示: 作者被禁止或删除 内容自动屏蔽




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