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

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

感觉 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

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