我的語言的界限,即是我的世界的界限。
-- 路德維希·維根斯坦, 邏輯哲學論
回過神來,才發現窗外愈來愈暗,淺灰色的雲,不知從何時開始,已在這個城市的上空聚集起來。
在其它的國度,函式常常是…次等公民。
例如 JAVA 王國,在很長的一段時間裡,一直都是個名詞的王國。在那時,所有的函式,都必須隸屬於一個物件,無法獨立存在。而這些與物件綁在一起的函式們,就稱之為方法 (method)。
在 JAVA 王國裡,你可以這樣把數列的內容由小排到大,稱之為排序:
// JAVA 語法
List<Integer> list = Arrays.asList(1, 4, 3, 6, 5, 2, 7, 8);
Collections.sort(list); //=> [1, 2, 3, 4, 5, 6, 7, 8]
但若你想要由大排到小,或是用不同的順序來排,那麼你要先另外創造一個用來比較的…物件,也就是身為主人的名詞,稱之為 Comparator,用來比較的物件。並在這個名詞裡,放進唯一的,用來排序的函式。
// JAVA 語法
class DescComparator implements Comparator<Integer> {
@Override
public int compare(Integer i1, Integer i2) {
return i2 - i1;
}
}
真正要進行排序呼叫時,再將這個用來排序,只擁有方法的物件實體化,當做第二個參數傳進去:
// JAVA 語法
Comporator cmp = new DescComporator();
Collections.sort(list, cmp); //=> [8, 7, 6, 5, 4, 3, 2, 1]
到了最近,情況似乎在慢慢的變好一點點了。在幾年前 JAVA 王國改朝換代時,終於引進了新的功能,讓大家可以如此排序數列:
// JAVA 8 以上的語法
list.sort((i1, i2) -> i2 - i1);
雖然那個長久以來強硬的王國,終於逐漸的改革了,但是…
「但是什麼?」
許多人們的觀點,並沒有改變。只把這個當做特殊的語法糖,或僅是方便的功能。而沒有意識到,這可以是視野上的重大革新:
函數,是生而自由的。
[To be continued]