language-agnostic – 当缩写列表和方法签名覆盖可用时,用于变量args语法

对于具有简单的列表简写语法的语言,例如

x = [1,2,3];

以及使用不同签名重载功能的能力……

函数的变量参数语法是否有任何用途,这些函数不是通过列表清楚地完成的?例如,varargs的常见用法是printf类型语句:

printf("This is %s while this is a number %d\n", "a string", 10);

但是,您可以轻松清楚地执行上述操作:

printf("This is %s while this is a number %d\n", ["a string", 10]);

到目前为止,我唯一能够提出的是控制流结构的实现,例如if / elseif / else,你希望能够传入可变数量的elseif / else块.但是,可以通过使用if作为单个命令将elseif分解为else来避免这种情况.

那么,如果没有专门的varargs语法,是否有类型的事情无法完成(干净/清晰)?

最佳答案 即使速记列表可以用于相同的目的,也应该包括变量args,因为它们可以提高直观性并减少错误.

[这假设您同意语言功能的可接受“使用”是直观性和错误减少.]

我的基础是纯粹的轶事经验,即在专有游戏脚本语言中使用这两种功能,以及观察到的学习曲线和用户所做的常见错误. [用户从新学校到行业资深人士,在不同游戏公司的十多年中的几个多年项目中 – 最大的有160个团队成员(20个核心脚本用户50个左右的脚本实时“命令 – 行“用户”.有些是纯粹的脚本编写者,只知道这种脚本语言或其他几个,有些也是专家C程序员 – 这两个组似乎在这个问题上有相同的结果.

[如果它是相关的 – 我所基于的语言也有类型变量参数,所有类型都有一个共同的基类.]

多年来,我创建了许多相同的双重方法,尽管一个使用了可变长度参数而另一个使用了列表.在内部,具有不同接口的方法都可以归结为相同的代码 – 它们仅仅是风格上的语法差异.

在“狂野”中,我发现使用包含两个附加字符的速记列表的机制意味着只有两个字符可以被遗忘.我的基础是我被称为“帮助”那些使用基于列表的方法版本而不是变量参数方法有问题的用户.

至于直观性,我已经对方法进行了一些分析/计数,使用可变长度方法的实例数量远远超过了列表方法.当被问及人们似乎在审美上更喜欢变量arg版本时.

但是我仍然认为,基于列表的方法具有很大的实用性,特别是在进行更复杂的调用和元编程时,因为将一堆参数作为单个单元和常用列表函数处理是很方便的 – 交叉点,联合,过滤,也可以在参数上使用等.

我非常相信只添加必要的功能来减少给定程序员在任何时候都需要保持在头脑中的数量,尽管多年来我发现这个规则的有效例外有时是有道理的.功能更易于使用或导致更少的错误. [我写的早期脚本语言非常精简 – 在我看来很优雅 – 虽然我学到了很多人喜欢它的困难方式,并且一旦我进化它以便在名称中有更多的“冗余”,它就会有更少的问题.直观性和错误减少.]

显然,围绕这些功能和不同用户和域的不同元素的不同语言可能会产生不同的结果 – 尽管根据我观察了多长时间,我相当自信.

[也]

变量args和速记列表之间的另一个潜在的具体区别取决于语言是否可以指定参数如何传递到方法/函数接口的变量arg方面与用作速记列表中的元素的参数/语句之间的区别.

如果变量arg参数可以指定超出可以为速记列表指定的内容(反之亦然) – 即参数通过引用而不是通过值传递,则参数将使用某种惰性求值或在调用时求值等等 – 然后可以用一种或另一种语法完成更多工作.

这实际上取决于语言,如果变量参数“group”或简写列表元素使用的参数可以以相同的方式“传递”,则没有区别.

点赞