在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];
来的方便吧。
因此, 在支持元级语法的语言当中, 千万不要浪费这项优秀的编程工具, 要使它在你的代码体现出合理的价值