Ruby 板


LINE

※ 引述《godfat (godfat 真常)》之铭言: : 换一种概念的话,也可以用变数的变数来形容 : 试着做做看: : class Qoo : def cool : puts 'cool ~~~~' : end : end : qoo = Qoo.new : x = Variable.new qoo : y = x : x.data # Qoo : y.data # Qoo : x.cool # 'cool ~~~~' : y.cool # 'cool ~~~~' : x.data = nil : x.nil? # true : y.nil? # true 简单地说,因为我们一次只能切断或接上一条链子(refer/point), 所以我们不能产生许多的链子,要集中一次处理。 用 Variable(上面的 x 与 y)去包装目标 instance(上面的 data), 接着所有要存取该 instance(data)的人,都透过这个 Variable(x, y) 也就是说,假设原本这样写: x = Qoo.new y = x 这样这个 Qoo 实体就是由 x, y 两条链子所链结 x = nil 打断一条,不影响另外一条 改写成 x = Variable.new(Qoo.new) y = x 这样就是 x, y 两条链子指向 Variable, 再由他统一练链结到真正的目标 也就是说,我们只有一条链子指向真正的实体(由 x.data 或 y.data 实现) 当我们写 x.data = nil 时,y 跟 x 指向同样的实体,所以 y.data 同样也会是 nil 但是基於方便使用的缘故,每次都呼叫 x.data.nil? 实在太烦了 故将所有的 method 都直接转交由 x.data 去回应会比较简洁 如此一来,只要不随便使用 x = ??? 的话,x 的操作者甚至可以不用 在乎 Variable 这个中间层。 实作法很简单,强力建议看倌自己实作看看 不过如果还是一点概念都没有的话,这里点出两个提示 1. 需要 method_missing 这东西拿来做 wrapper 实在是太完美了 2. 需要重新定义所有原本已经存在的 method 不然你写 x.nil? 永远都会是 true, 因为 Variable 存在 需要把 x.nil? 改写成 x.data.nil? 以下有捏 XD class Variable instance_methods.each{|i| # 改写所有的 instance method next if i == '__id__' || i == '__send__' # 不建议改写 __id__ 与 __send__, 所以跳过 module_eval <<-"end_eval" def #{i} *arg, &block method_missing :#{i}, *arg, &block end # 一律改写成这个 method 不见啦! end_eval } def initialize data @data = data end def method_missing msg, *arg, &block @data.__send__ msg, *arg, &block # 所有 message 一律转交给 @data 去回应 end attr_accessor :data # 唯一留下来的只有 initialize 和 data, data= 这三个 method. end -- 生死去来、棚头傀儡、一线断时、落落磊磊 《花镜》-世阿弥 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP