今晚看到v2ex上有人感叹Python没有赋值表达式不方便:
本来可以写成:
if result=func1(...): print func2(result)
因为没有赋值表达式,所以必须写成:
result=func1(...) if result: print func2(result)
我跟帖说了自己的想法:
Scheme/Lua也没有。
赋值语句的返回值为所赋的值,这个我理解起来感觉蛮困难的——我觉得赋值语句应该是没有返回值,或者返回值为nil之类的东西(Haskell里类似赋值的操作返回值的类型是
()
,纯副作用的返回值)。
别的语言里,
if a == 1
,粗心少打一个=
号,变成if a = 1
就出问题了,但是Python就没这个问题。这一点上比较方便。
真是无巧不成书。前几天刚好看到spine.js有这样一句代码:
listeningToOnce = @listeningToOnce or= []
于是我就手贱给改成了
@listeningToOnce or= []
listeningToOnce = @listeningToOnce
PR 里给的理由是编译出来的js就是赋值表达式:
listeningToOnce = this.listeningToOnce || (this.listeningToOnce = []);
So, (this.listeningToOnce = [])
returns the assigned value.
In Scheme/Python/Lua, assignment does not return a value.
This design feels more nature to me.
In some languages assignment returning a value may cause problem in conditions, eg. if a == 1
and if a = 1
(mistype).
Fortunately, in CoffeeScript, we can use is
(if a is 1
) to avoid this pitfall.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。