PLT 板


LINE

看板 PLT  RSS
※ 引述《mystea (mystea)》之铭言: : 但我不太懂你所说的side-effect是甚麽意思? http://en.wikipedia.org/wiki/Side_effect_%28computer_science%29 简单地说就是所有会影响到别人的操作都是 side-effect. 例如: a = 10 function(a) puts a # => 如果不是 10, function 就有对 a 的 side-effect. 或是如果你今天没有宣告要使用变数 b, 但是忽然间 b 就成为某个变数, 那麽这也是某个 side-effect 之下的产物。 : 恩, 我昨天po文的时候有想. 我们可以定义一个特别的namespace, 专门留给这些 : 子函式制造的变数. 比方说子函式fitline产生的变数a可以叫做 : fun::fitline::a (但是scope在main!), fun就是留给子函式们的namespace. : 因为只能有一个叫fitline的function, 所以这样一定不会跟别人的程式打架. 我是觉得有更多更好的作法,不用这种方式。 像是: a, b = fit_line(...) 然後你就可以取得 fun::fitline::a 和 fun::fitline::b, 这样不是更清楚明确吗?也不会有 side-effect. : 像这样吃进两个点, 制造出两个coefficient的函式, 算是有side-effect吗? 只要影响到对於 callee 以外的东西,都算 side-effect. callee: http://encyclopedia2.thefreedictionary.com/callee (programming) callee - The function or subroutine being called by the caller. : google了一下, 模组化的定义好像就是"不会影响到程式别的部份," 那是不是跟 : side-effect的定义相同呢? 如果这样为什麽有可能side-effect多但是模组化好? 因为完全没有 side-effect 的话,有些东西是做不起来的。 只要 side-effect 有良好掌控的话,重复利用性会更高。 举 c++ swap 为例,一般 swap 会这样写: tmp = a a = b b = tmp 如果要把这一段做成模组,没有 side-effect 是办不到的。 像是在 java/c#/ruby 里,由於没有 call by reference, 单单这样写是没办法成为 swap function 的。 在 c++, 透过 call by reference,也就是做 variable alias, 可以使得上面的操作(callee)就像在外面(caller)操作一样。 (也就像你一直想做的东西) swap(a, b); 藉由 side-effect 去改变 a, b 的内容。 ruby 有个很漂亮的 swap 方式,倒是不用 side-effect:(如果 variable 不算 side-effect 的话...... 完全没 side-effect 是根本没 variable.) a, b = b, a 也就是说,swap 也不见得真的要用那三行去实作, 也就是不见得做某一件事一定需要 side-effect.(可以被包装起来) 但是在没办法像上面那样一行完成的语言中, 写 swap function 还是最直接简单、重复利用性最高的。 (或是,macro, 这可能需要请教用 lisp 的人?我不太熟) ruby 还能写更长的 swap: a, b, c = b, c, a 这比单纯的 swap 还厉害得多,快来试 ruby 吧 XD : 哇! 那godfat大真是太厉害了. 希望有一天我也可以跟他一样(远目). 一点都不厉害,其实心虚得很 XDDD 不过如果不试着去说出自己的理解是什麽,那就很难真的去确认自己的理解对不对。 总之就是讨论吧 ~ : 可以小小归结这次的结论吗: local variable的scope被设定成仅限於自己, 连自己的 : 子函式都不能接触到, 并不只是为了名称可以重复使用. : 最主要的原因, 还是因为"鼓励"使用者写出"模组化"的程式, 亦即, 程式各部份可以 : 视为独立个体. 因为程式是以函式为最小的compile单位, 所以模组化的意义也可说就 : 是, 函式与函式之间没有实作上的依赖性. 一个能够保证函式之间没有实作依赖性的 : 方法, 就是只使用local variable. 是的,我同意,说得不错 :) 名称重复使用只是模组化後的结果罢了 : 这麽说来, pass by reference也应该是不被鼓励的罗?! 最好是能够用tuple datatype : 来取代. 这就不见得了,还是要看场合。甚至是,programmer 的习惯 :) 有些时候用 tuple 会变得太罗唆时,适度用 call by reference 我觉得也没什麽不好。但是可以确定的是,有这种功能的语言好像 真的不多就是了。所以看是要当少数语言的超强功能, 还是逐渐该被禁止的密招,可能还是看人吧。 -- #!/usr/bin/env ruby [露比] /Programming (Kn|N)ight/ 看板《Ruby》 # if a dog nailed extra legs that http://webptt.com/cn.aspx?n=bbs/Ruby/index.html # walks like an octopus, and Welcome ~Ruby@ptt~ # talks like an octopus, then ◢█◣ http://www.ruby-lang.org/ # we are happy to treat it as http://www.ruby-doc.org/ # if it were an octopus. http://www.rubyforge.org/ --



※ 发信站: 批踢踢实业坊(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灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP