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

Project1

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

[已经解决] 关于alias用法的问题

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-10-28
帖子
58
跳转到指定楼层
1
发表于 2009-11-7 05:55:20 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

Lv4.逐梦者

梦石
0
星屑
6865
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

10
发表于 2009-11-7 23:43:35 | 只看该作者
本帖最后由 后知后觉 于 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 被重新定义了











你知道得太多了

回复 支持 反对

使用道具 举报

Lv1.梦旅人

B

梦石
0
星屑
50
在线时间
26 小时
注册时间
2007-8-26
帖子
3693
9
发表于 2009-11-7 22:51:24 | 只看该作者
看多了,玩多了,自然而然就会懂。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

8
发表于 2009-11-7 22:03:34 | 只看该作者
本帖最后由 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


汗....  我也说不清楚 = =
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-10-28
帖子
58
7
 楼主| 发表于 2009-11-7 14:47:49 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

℃ake

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-6-6
帖子
787
6
发表于 2009-11-7 14:00:04 | 只看该作者
sorry,最后一行是ABC.new.P
我爱66RPG,但我讨厌66.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-10-28
帖子
58
5
 楼主| 发表于 2009-11-7 13:31:54 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

℃ake

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-6-6
帖子
787
4
发表于 2009-11-7 12:46:16 | 只看该作者
谢谢楼上的耐心解答,第一部分已经理解了.
第二部分放入脚本编辑器后会出现:undefined method for "p".
蓝色水晶 发表于 2009-11-7 12:39

在进行后面的试验时。前面的这段脚本。
  1. class ABC
  2. def P
  3. p 'a'
  4. end
  5. end
复制代码
请不要删除。
如第二段脚本和第三段脚本。
在这段脚本不删除的情况下才允许使用。
因为重命名是对原有的方法名进行修改,把前面的定义删除后,重命名自然就会失效(找不到需要修改的方法名,所以要抛出异常)。
我爱66RPG,但我讨厌66.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-10-28
帖子
58
3
 楼主| 发表于 2009-11-7 12:39:32 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

℃ake

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-6-6
帖子
787
2
发表于 2009-11-7 06:05:14 | 只看该作者
本帖最后由 奶油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"

希望能帮助你理解。
我爱66RPG,但我讨厌66.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-28 03:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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