作者godfat (godfat 真常)
看板PLT
标题Re: [问题] 为什麽local variable的scope不能延及ꐠ…
时间Thu Mar 6 18:15:49 2008
※ 引述《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