关于 block 的困惑

2014-05-05 14:28:48 +08:00
 johnnyb
https://gist.github.com/twlz0ne/16fe38b5a3c5f28a76f1
最后一行不理解, &lambda {} 不是转成 block 了吗?
5064 次点击
所在节点    Ruby
13 条回复
johnnyb
2014-05-05 14:36:09 +08:00
johnnyb
2014-05-05 14:37:20 +08:00
johnnyb
2014-05-05 14:38:14 +08:00
坑爹,我已经忘了怎么贴 gist 了
dorentus
2014-05-05 15:09:58 +08:00
dorentus
2014-05-05 15:20:00 +08:00
block 的话,要不就这么直接用 block:
func { ... } 或者 func do ... end
要不就是这样用一个 proc:
func(&proc)

最后的那个 foo() &lambda {},其实我也不是很明白,但是可以确定的是传入 foo 的参数是 0 个,后面那个 proc 没起啥作用……
KDr2
2014-05-05 16:19:39 +08:00
难道不是 (foo()) & (lambda {})

:D
dorentus
2014-05-05 16:24:54 +08:00
@KDr2 真的欸!
难怪返回值是 false...
johnnyb
2014-05-05 18:47:24 +08:00
@KDr2 运算符优先级的关系?foo &lambda {} 其实是 foo(&lambda {}) ?
KDr2
2014-05-05 22:03:39 +08:00
@johnnyb
嗯,就是看 Parser 怎么 parse 的吧,

对 foo() &lambda {} 来说 foo() 后面没有 "{" 和 "do"已经是个完整的 function-call, lambda {} 也是合法 expression,两者 & 起来也是合法的 expression。
对 foo &lambda {} 来说 foo 可能不是一个完整的function-call, 还要继续看后面有没有参数,然后发现&开头的block
orzfly
2014-05-05 22:45:56 +08:00
orzfly
2014-05-05 22:47:47 +08:00
https://gist.github.com/18bad83973614abb03f3

你看,前者是 foo(lambda(&{})),后者是 foo().&(lambda{})
johnnyb
2014-05-06 00:02:17 +08:00
@orzfly [赞]
tangzx
2014-05-06 10:27:24 +08:00
& 加在 block 名前,便只能写进括号里(和实参一样)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/111207

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX