Erlang 将参数传递给函数:两元素元组v。两个不同的论点?

Erlang 将参数传递给函数:两元素元组v。两个不同的论点?,erlang,Erlang,在某些情况下,我发现将两个参数传递给函数(例如两个列表)比传递包含两个列表的元组更为清晰。哪一种被认为是更好的风格?效率有什么不同吗 谢谢。这主要是一个品味问题和一个精心设计的API。如果你遵循“不要让我思考”的哲学,你可能最终会使用两种方法 在参数中使用元组有时可能会令人困惑,因为它不是琐碎的,必须记录在案。例如,lists:zip({List1,List2})会令人困惑,因为单独发送列表更直观 如果这两个列表属于同一个列表,并且在使用前将通过多个函数传递,那么将它们组合成一个元组就很方便了,

在某些情况下,我发现将两个参数传递给函数(例如两个列表)比传递包含两个列表的元组更为清晰。哪一种被认为是更好的风格?效率有什么不同吗


谢谢。

这主要是一个品味问题和一个精心设计的API。如果你遵循“不要让我思考”的哲学,你可能最终会使用两种方法

在参数中使用元组有时可能会令人困惑,因为它不是琐碎的,必须记录在案。例如,
lists:zip({List1,List2})
会令人困惑,因为单独发送列表更直观

如果这两个列表属于同一个列表,并且在使用前将通过多个函数传递,那么将它们组合成一个元组就很方便了,这样一来,途中的函数就不必单独传递它们。这使得元组几乎成为一个轻量级的“对象”,您可以传递它。理解“对象”的函数可以查看它,也可以将它拆分并调用单独对元素进行操作的更深层次的函数

有时,这两个列表相互关联,因此始终将它们保存在一个元组中更有意义:

aquire(Caller, {[Item|Free], Busy}) -> {Free, [{Caller, Item}|Busy]};
aquire(_Caller, {[], _Busy})        -> {error, no_free_items}.

就我个人而言,如果可以接受的话,我更喜欢两个独立的参数(如果你的函数要在map中使用,它不是一个例子),因为它会产生较少的视觉噪音,但它确实是基于广泛的观点的。你的例子就是我正在研究的问题。我发现元组的命名有问题:UnusedBusyTuple?忙吗?这样的名称可能很难理解,而且它们没有明确说明元组包含什么,其中
register(frequency,spawn(frequency,init,[])
init()->loop(getFrequencies(),[])
然后
loop(UnusedFreqs,BusyFreqs)->似乎比
loop(FreeBusy)->更清晰…
--即使在loop()内部,我最终还是将这两个列表传递给了其他函数,例如allocate\u freq()、deallocate\u freq()。我还注意到,在您的示例中,您使用的是
\u Caller
\u Busy
,而不是
\u
,我认为这使函数更容易理解。建议这样做吗?至于命名,我只把它叫做
Frequencies={Free,Busy}
。这与在面向对象语言中如何命名对象及其字段的问题相同。我认为建议将变量名保留在下划线之后,因为它记录了代码,并且不太容易混淆到哪里。因此,类似这样的内容:
Free=get\u frequencies(),Busy=[],frequencies={Free,Busy},loop(frequencies)
而不是
loop({get\u frequencies(),[])
在这两种情况下都将循环定义为
循环(频率)->…
?我喜欢第一种情况的清晰性——尽管它更详细。如果代码简短而明显,我甚至不会在安装过程中为它们创建临时变量。它应该有足够的文档记录,因为它在代码中的其他地方都有。