Project1

标题: 关于alias用法的问题 [打印本页]

作者: 蓝色水晶    时间: 2009-11-7 05:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 奶油Da蛋糕    时间: 2009-11-7 06:05
本帖最后由 奶油Da蛋糕 于 2009-11-7 06:13 编辑

这个帖子已经说的很详细了,附上一个例子加深你的理解吧。
  1. class ABC
  2. def P
  3. p 'a'
  4. end
  5. end
复制代码
这是一段比较简单的脚本,可以用ABC.new.P调用,你会看到屏幕上出现了"a"。
  1. class ABC
  2. alias p_cake P
  3. end
复制代码
这样的话就把方法P重命名为p_cake了,你会发现你可以用ABC.new.p_cake调用了。

然后,怎样插入一些内容进去呢?
  1. class ABC
  2. alias p_cake P
  3. def P
  4. p_cake
  5. p "b"
  6. end
  7. end
复制代码
这样的话就是先给P重命名为p_cake,然后再在下面定义P调用p_cake,这样就做到了在原有的基础上增加东西的功能。你会发现这个时候调用ABC.new.p成功输出了"a","b"

希望能帮助你理解。
作者: 蓝色水晶    时间: 2009-11-7 12:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: 奶油Da蛋糕    时间: 2009-11-7 12:46
谢谢楼上的耐心解答,第一部分已经理解了.
第二部分放入脚本编辑器后会出现:undefined method for "p".
蓝色水晶 发表于 2009-11-7 12:39

在进行后面的试验时。前面的这段脚本。
  1. class ABC
  2. def P
  3. p 'a'
  4. end
  5. end
复制代码
请不要删除。
如第二段脚本和第三段脚本。
在这段脚本不删除的情况下才允许使用。
因为重命名是对原有的方法名进行修改,把前面的定义删除后,重命名自然就会失效(找不到需要修改的方法名,所以要抛出异常)。
作者: 蓝色水晶    时间: 2009-11-7 13:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: 奶油Da蛋糕    时间: 2009-11-7 14:00
sorry,最后一行是ABC.new.P
作者: 蓝色水晶    时间: 2009-11-7 14:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: link006007    时间: 2009-11-7 22:03
本帖最后由 link006007 于 2009-11-7 22:12 编辑

alias 成为ruby最热门语法了= =
alias 就是给方法取别名.
从效果上来说:
原先有一个方法叫 method,  那么 alias method_old method 之后,那么以后调用method_old时调用的就是原来method的执行过程
这样可以通过重定义method来调用 method_old 实现对原函数执行过程的追加
从解释器上来说:
就是找到原始函数符号和执行内容的映射,修改这个映射,更新符号表
ruby对脚本的组织是以node来管理的,在ruby解释器读入脚本时,遇到alias,则会查找目标类的原函数,
然后判断alias有效性,无效则抛出异常(如没有原始方法,这回调用print_undef方法),如果有效,则跟新node连接信息,插入符号表,最后调用一次method_added或者singleton_method_added<--这两个是ruby脚本可调用的方法
link006007 发表于 2009-10-19 02:15


汗....  我也说不清楚 = =
作者: ONEWateR    时间: 2009-11-7 22:51
看多了,玩多了,自然而然就会懂。
作者: 后知后觉    时间: 2009-11-7 23:43
本帖最后由 后知后觉 于 2009-11-8 00:00 编辑

换种说法就是方法的复制
把一个方法复制一个.再重新定义
在重新定义的时候调用复制的另外那个就实现了还原原方法的内容的效果
然后再写点新的东西进去实现效果的追加
说是方法的复制或许不准确.但貌似好像的确是这样做的- -
  1. class A
  2.   def pa
  3.     p "a"
  4.   end
  5. end
  6. class A
  7.   alias old_pa pa
  8.   def pa
  9.     old_pa
  10.     p "b"
  11.   end
  12. end
  13. class A
  14.   alias hzhj_pa old_pa
  15.   def old_pa
  16.     hzhj_pa
  17.     p "c"
  18.   end
  19. end
  20. a = A.new
  21. a.hzhj_pa  # => "a"
  22. a.old_pa   # => "a";"c"
  23. a.pa       # => "a";"c";"b"
  24. b = a.method :old_pa
  25. c = a.method :pa
  26. d = a.method :hzhj_pa
  27. p b.object_id
  28. p c.object_id
  29. p d.object_id
复制代码
根据脚本从上到下执行的原则
先定义了方法 pa
然后复制了一个和pa内容一样的方法叫 old_pa
这个时候单独调用pa和old_pa的结果都是弹出一个"a"
然后重新定义了pa
这个时候调用pa弹出来"a";"b"
而调用old_pa仍然还是只弹出来一个"a"
然后复制了一个和old_pa一样内容的方法叫hzhj_pa
这个时候3个方法的效果是这样
pa   "a";"b"
old_pa  "a"
hzhj_pa  "a"
然后重新定义了old_pa
这个时候3个方法的效果是这样
pa  "a";"c";"b"
old_pa  "a";"c"
hzhj_pa  "a"
为什么pa本来是 "a";"b"
却变成了 "a";"c";"b"
因为 old_pa 被重新定义了




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