#10 楼 @ruby_sjf 现在SegmentFault 正在招 PHP 工程师 你可以试着投下简历。
@zw963 這一句是 Matz 書裏的,我自己的從下一段纔開始。只能有一個參數,結合上下文應該不會誤解吧。例如樓主的例子, { |user| user.id > 33 }
,塊只能收user
一個參數,不能另外傳參數給它。
《七周七語言》裏訪談了 Matz,Matz 被問到最喜歡 Ruby 什麼的時候,就說最喜歡 block。既然這裏是瞎扯淡,我就把當時的讀書筆記抄一下:
Matz: 我喜歡它寓編程於樂的方式。說到某個具體的技術點,我最喜歡的是“代碼塊”(block)。代碼塊即是一種易於控制的高階函數,也爲 DSL 及其他特性的實現提供了極大的靈活性。(p. 9) 這裏 Matz 說謊了。block 很像高階函數,但不是函數。
->(x){x+3}.call 3
返回 6. 而
{|x| x + 3}.call 3
將導致
syntax error
. Ruby 的祖先 Smalltalk 中,block
倒是可以接受消息的:[:x | x + 3] value: 3
返回 6. 所以 Ruby 的 block 是個奇怪的東西。縱向來說,它很像 Smalltalk 的 block,橫向來說,它很像匿名函數。但是事實上,它和兩者都不一樣。Ruby 的口號是「Principle of Least Surprise」,但是這個 block 卻讓我吃驚。 語意上塊讓人迷惑,語法上也不好。塊有兩種表達法:大括號或者 do...end,問題在於優先級是不同的。例如
f x {|x| puts x}
和f x do |x| puts x end
是不一樣的,前者等於f(x {...})
,後者等於f(x) do...end
。初學的時候很容易搞混。 Matz 在他寫的《まつもとゆきひろコードの世界 : スーパー・プログラマになる 14 の思考法》一書中提到了設計塊的緣由:
- 減少對象的生成數,因爲早期 Ruby 生成閉包對象的代價很高。
- 外觀上看起來像控制結構。 Matz 還提到,傾向於使用高階函數的 OCaml 的 2239 個庫函數,沒用函數參數的佔 87.2%,用一個函數參數的佔 12.1%,也就是有兩個以上的不到 1%。因此,大多數情況下,只能有一個參數的塊也夠用了。 所以說,塊就是一個語法糖,讓習慣過程式編程的程序員可以使用類似高階函數的東西(同時讓 Smalltalk 和 Lisp 的來客大吃一驚)。
http://ruby-china.org/wiki/ruby-meta
Ruby 和元编程的故事 - 第 1 回:色色空空,万物皆为对象:
Ruby 和元编程的故事 - 第 0 回:欲练神功,必先自废武功
0 和 1 反了
http://ruby-china.org/wiki/gems <-- 「来自 Twitter 的 Bootstrap,是一套完成的前台 CSS 框架。」s/成/整/
「采集数据是我们需要解析复杂的 HTML 结构」s/是/时/
「它都很很好的处理」 <-- s/很/能/
「那你就用大吧」 <-- s/大/它/
「不够某些项目可能不起效果」 <-- s/够/过/
rolify Very simple Roles library without any authorization enforcement supporting scope on resource object.
这个没翻译,尝试翻了下:
一个非常简单的角色设定模块,不强制要求认证,支持资源对象范围。
仅对企业,3 个月期限,诱惑不大呀……
wiki 每个人都可以编辑么?我没法编辑呀。 http://ruby-china.org/wiki/rvm-guide 《-- 这里「这里所有的命令都是再用户权限下操作的」,s/再/在/
http://segmentfault.com/a/1190000000340567 #70 楼 @chunlea 改成「Dropbox 链接(非全部)作为备选方案。」了
s/theRuby/the Ruby/
搬到了 segmentfault 上,整理了下版式 http://segmentfault.com/a/1190000000340567