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

Project1

 找回密码
 注册会员
搜索
123
返回列表 发新帖
楼主: 八云紫
打印 上一主题 下一主题

alias的用法(500分)

 关闭 [复制链接]

Lv1.梦旅人

风之塞尔达

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

贵宾

21
发表于 2008-5-16 20:41:01 | 只看该作者
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, 有兴趣自己去看源码 = =
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

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

贵宾

22
发表于 2008-5-16 20:45:04 | 只看该作者
函数本来就会占用内存, alias感觉上只是为了保留原方法而存在的
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
288
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

23
 楼主| 发表于 2008-5-16 20:46:26 | 只看该作者
就是说使用 alias 后,调用这个方法的时候,实际上调用的是旧的方法?

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-2-18
帖子
1423
24
发表于 2008-5-16 20:57:44 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

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

贵宾

25
发表于 2008-5-16 21:03:17 | 只看该作者
也不能算旧吧  毕竟还是变了
我只是把调用ruby函数想成顺序遍历链表(不知对不对... ...),
也就是每次的函数调用都是同一个入口
每一次alias就好像在链表某些位置插入了新元素
于是你每次遍历同一个链表时, 就可以得到最新的结果
以下引用八云紫于2008-5-16 12:09:53的发言:
对alias的工作原理很表示怀疑,为什么旧方法改变,新方法还可以具有旧方法的特性。

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

PS  当心内存, 不如控制好自己的类结构和程序流程
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1030
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

26
发表于 2008-5-16 21:27:38 | 只看该作者
引發 SystemStackError
def a
  p 1
end

alias b a
def a
   b
end

alias b a
def a
   b
end

a

exit
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

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

贵宾

27
发表于 2008-5-16 21:51:35 | 只看该作者
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   一样  无限递归   


在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-4-15
帖子
114
28
发表于 2008-5-16 22:30:47 | 只看该作者
大好蹲监狱了  只好过来补一下(刚好够100积分- -)
link006007 说的纯属YY, 有意者请自行阅读源代码, 莫要被误导
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

29
发表于 2008-5-17 06:30:04 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-24 00:35

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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