Ruby Ruby 引入 block 机制是否利大于弊

lilijreey · 2018年10月04日 · 最后由 nouse 回复于 2018年10月17日 · 1320 次阅读

感觉 block 和高阶函数的作用类似,但是概念有不同。如果 ruby 不引入 block 是否会更好一些。

没有 block 我就不用 ruby 了,jquery 特地从 ruby 借鉴了 each 方法

block 机制体现了东方文化的精髓:从宏观到微观的思维方式。
西方的思维方式是从微观到宏观,比如名在前姓在后,地址也是先写街道再到区、市、省、国。东方的思维方式是反过来。

ruby 处处体现着东方的智慧,正是 ruby 的这个特质,让 DHH 深深的着迷,用 ruby 写出了举世瞩目的框架 rails,从而影响了 web 开发的历史进程。

block 就是一个高阶函数,但是又没有函数那么灵活,而且又增加了复杂度,唯一的好处就是写起来方便。 好像引入 block 是因为性能考虑

光去掉 block 不能让拧巴的东西变得不拧巴,你还需要去掉函数不用括号就可以调用的设定,然而那样就不是 ruby 了

Block 难道不是 Ruby 的精华之一么……

block 就是一个匿名函数吧?

sevk 回复

不是,完全不是

block 和缩进有关,事实上你写 promise 写得多,就会发现一个函数拿两个匿名函数是很扯的。所以 ruby 里干脆只让方法带一个匿名函数,就是 block。

Rust 的闭包就很像是 block 了,Rust 闭包和 Ruby block 相比更像是 function,但和 function 也不完全相同,所以不能算是去掉了 block。

体验是会少很多特殊情况,比如 block 的特殊的上下文跳转规则就不需要了。 而 Ruby block 的上下文跳转也就是在 each 这些里面会使用,Rust 选择了使用 for 语法,其他当作匿名函数的情况 Rust 使用了类似 block 的语法来表达。

相比之下 Rust 闭包设计的更简洁,意外情况更少。像是 Ruby 中 block 可以传给任意方法, block_given? 这些配合 block 的特殊语法就都不需要了

sevk 回复

不是,你试试在 block 里面 return

需要 登录 后方可回复, 如果你还没有账号请 注册新账号