将参数传递给函数:两个元素的元组 v. 两个单独的参数?
Passing arguments to a function: a two element tuple v. two separate arguments?
在某些情况下,我发现如果将两个参数传递给一个函数会更清楚,例如两个列表,而不是传递包含两个列表的元组。哪个被认为是更好的风格?效率有什么不同吗?
谢谢。
这主要是品味问题和精心设计的 API。如果您遵循 "don't make me think" 理念,您最终可能会同时使用这两种方式。
在参数中使用元组有时会造成混淆,因为它很重要并且必须记录在案。例如,lists:zip({List1, List2})
会造成混淆,因为单独发送列表更直观。
如果这两个列表属于一起,并且在使用之前将通过多个函数传递,将它们组合成一个元组会很方便,这样途中的函数就不必分别传递它们。这使得元组几乎是一个可以传递的轻量级 "object" 。理解 "object" 的函数可以查看它,或者将其拆分并调用分别对元素进行操作的更深层次的函数。
有时这两个列表彼此如此相关,以至于始终将它们保存在一个元组中更有意义:
aquire(Caller, {[Item|Free], Busy}) -> {Free, [{Caller, Item}|Busy]};
aquire(_Caller, {[], _Busy}) -> {error, no_free_items}.
在某些情况下,我发现如果将两个参数传递给一个函数会更清楚,例如两个列表,而不是传递包含两个列表的元组。哪个被认为是更好的风格?效率有什么不同吗?
谢谢。
这主要是品味问题和精心设计的 API。如果您遵循 "don't make me think" 理念,您最终可能会同时使用这两种方式。
在参数中使用元组有时会造成混淆,因为它很重要并且必须记录在案。例如,lists:zip({List1, List2})
会造成混淆,因为单独发送列表更直观。
如果这两个列表属于一起,并且在使用之前将通过多个函数传递,将它们组合成一个元组会很方便,这样途中的函数就不必分别传递它们。这使得元组几乎是一个可以传递的轻量级 "object" 。理解 "object" 的函数可以查看它,或者将其拆分并调用分别对元素进行操作的更深层次的函数。
有时这两个列表彼此如此相关,以至于始终将它们保存在一个元组中更有意义:
aquire(Caller, {[Item|Free], Busy}) -> {Free, [{Caller, Item}|Busy]};
aquire(_Caller, {[], _Busy}) -> {error, no_free_items}.