
170
|
第 6 章
相等
如果想要找出 proc 裡的程式碼,唯一的方式就是呼叫它,所以如果以相同的引數呼叫
而會產生完全相同的結果,就算內部的程式碼並不相同,這兩個 proc 也可以互換。
這種根據外在可見的行為將兩件事物視為相等的想法,稱為
擴充相等
(
extensional
equality
)。
假設我們有個 proc
p
:
>> p = -> n { n * 2 }
=> #<Proc (lambda)>
我們可以讓另一個 proc
q
只接受一個引數,並僅以它來呼叫
p
:
>> q = -> x { p.call(x) }
=> #<Proc (lambda)>
p
和
q
很顯然是兩個不同的 proc,但它們是擴充相等,因為它們對任何引數都做了完全
相同的事情:
>> p.call(5)
=> 10
>> q.call(5)
=> 10
瞭解
p
等於
-> x {p.call(x)}
便開啟了重構的新機會。如果我們在自己的程式看到一
般的範式
-> x {p.call(x)}
,就可以選擇只以
p
替換整個運算式來剔除它,並且在某
些情況(稍後將會討論)可能也會決定進入另一個方向。
語法
Ruby 提供了建立和呼叫 proc 的語法選擇。從現在開始,我們將使用
-> arguments {body}
來建立 proc 和方括號來呼叫它:
>> -> x { x + 5 }[6]
=> 11
這樣很容易就能看到 proc 的主體和引數,而不會有太多礙手礙腳的額外語法。
問題
我們的目標是編寫知名的 FizzBuzz 程式: