在JavaScript或php之類語言, 因為不支持元組, 嚴重影響了編程體驗和代碼可讀性,用過從語言層面原生支持元組語法的語言后, 才會覺得不支持元組的語言真的low到了家,元組真的是編程語言中不可多得的優良特性。
元組最重要的特點是用來實現多值返現, 對於天生就支持多值返回特性的語言, 如golang, 元組存在的意義不大。 然而, 對於只支持單反回值函數的語言碰到有多返回值需求的場景時就操蛋了, 假如要實現多返回值效果, 通常有兩種方案。
第一種, 把這些要返回的值塞入一個對象,然后返回這個對象。然而, 這種做法會增加不必要的代碼量, 在類似於Java之類的死板語言中的做法是先寫一個類,實例化后填充數據再返回, 折騰,造孽。JavaScript和php中稍微好點, 直接返回object或array就可以,但是要為返回值指定名稱這一步也是冗余的,很多時候通過返回值的類型就能確定返回值的作用了,指定名稱多此一 舉。
第二種, 把這些要返回的值塞入一個列表, 然后返回這個列表。 然而, 這種做法會對代碼的可讀性造成影響, 在Java之類的靜態語言中,根本無法使用這種方法, 它的語言特性規定 , 列表數據結構中只能存放同類型的元素。 當然, 你可以使用Object類型的列表, 但以這種方式寫出來的代碼, 但是我相信任何一個技術水平過關或者有職業操守的程序員都不會這么做。 而對於支持多類型元素列表的語言如JavaScript、php以及python到的確可以以這種方式實現,但是在這些語言的世界里,所有的列表都是一樣的
[]
[1,2,3]
["a","b","c"]
[1,2,3,"a","b","c"]
這些列表對於這類語言來說長的是沒差的。
而元組卻不同, 每個不同規格的元組是不同的
(1,2,3)
("a","b","c")
(1,2,3,"a","b","c")
是不同的, 因為它們背后的定義分別是
(int,int,int)
(string,string,string)
(int,int,int,string,string,string)
或許你認為,動態類型語言中, 根本沒有編繹期類型檢查一說, 所有類型都是在運行期確定的, 所以不從性能的角度考慮, 元組和列表還是沒有差別的。 然而, 現在編程語言的IDE基本都具備了語法檢查的能力, 就算是動態類型語言,不按照函數返回值的規格去使用返回值,IDE也能給出錯誤提示, 因此,把元組和列表進行區分,對代碼的可讀性還是很有幫助的。 而且在靜態類型語言中這種好處會被放大,連c#都要把元組做成語言內置的語法特性,這足以說明元組能起到的作用不容小噓。
最后,我想
let tuple = (1,"a",true);
let v1, v2,v3 = tuple;
總比
let list = [1,"a",true];
let v1 = list[0];
let v2 = list[1];
let v3 = list[2];
來的方便吧。
因此, 在支持元級語法的語言當中, 千萬不要浪費這項優秀的編程工具, 要使它在你的代碼體現出合理的價值
