在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];
來的友善吧。
是以, 在支援元級文法的語言當中, 千萬不要浪費這項優秀的程式設計工具, 要使它在你的代碼展現出合理的價值
知乎:https://www.zhihu.com/people/aspwebchh
github:https://github.com/aspwebchh
email: [email protected]