问题标签 [pass-by-name]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
63330 浏览

parameter-passing - 什么是“按名称传递”,它是如何工作的?

我已经检查了 Wikipedia 并在 Google 上搜索过,但我仍然无法理解名称传递在 ALGOL 60 中的工作原理。

0 投票
3 回答
920 浏览

scala - 构造函数的按名称参数

来自我的另一个问题 有没有办法让构造函数工作的名称参数?我需要一种方法来提供一个在对象内按需/延迟/按名称执行的代码块,并且该代码块必须能够访问类方法,就好像该代码块是该类的一部分一样.

以下测试用例失败:

输出:

0 投票
6 回答
1425 浏览

programming-languages - 是否有一种具有本地传递引用/传递名称语义的语言,可用于现代生产应用程序?

这是一个重新打开的问题。

我为它寻找一种语言和支持平台,默认情况下该语言可以具有传递引用或传递名称语义。我知道一点历史,有 Algol、Fortran,还有 C++ 可以使它成为可能;但是,基本上,我寻找的是更现代的东西,并且在默认情况下,首选提到的值传递方法(假设)。

我问这个问题,因为在我看来,pass-by-ref/name 的一些优点似乎很明显。例如,当它用于独立代理时,不需要复制值(在某种程度上),并且在这种情况下性能不会降级很多。因此,我可以在富客户端应用程序或一些游戏风格或独立服务类应用程序中使用它。

对我来说,主要优势是符号的身份与其当前值之间的明确分离。我的意思是当没有冗余复制时,您知道您正在使用您查询/接收的确切符号/路径。并且对值进行装箱不会干扰程序的实际逻辑。

我知道有 C#ref关键字,但它不是那么内在,虽然可以接受。同样,我意识到引用传递语义几乎可以用任何语言模拟(Java 作为一个即时示例)等等.. 不确定通过名称传递:)

你会推荐什么 - 在适当的地方为此类需求创建类似 DSL 的东西;或者使用一些我已经知道的语言?也许,我错过了什么?

谢谢!

更新:目前,我认为 Haskell 是合适的。但是我没有做太多调查,所以我想我会在以后更新这个文本。

0 投票
13 回答
1971 浏览

c++ - 在 C++ 中仅使用堆栈的后果

假设我认识一个 C++ 新手。他不传递指针(正确地如此),但他拒绝通过引用传递。他总是使用传递值。原因是他认为“通过引用传递对象是设计失败的标志”。

该程序是一个小型图形程序,大部分传入的问题是数学向量(3 元组)对象。有一些大的控制器对象,但没有比这更复杂的了。

我发现很难找到一个反对仅使用堆栈的杀手级论点。

我认为按值传递对于向量等小对象来说很好,但即便如此,代码中也会发生很多不必要的复制。按值传递大对象显然是浪费的,而且很可能不是您想要的功能。

在专业方面,我相信堆栈在分配/释放内存方面更快,并且具有恒定的分配时间。

我能想到的唯一主要论点是堆栈可能会溢出,但我猜这不太可能发生?是否有任何其他反对仅使用堆栈/按值传递而不是按引用传递的论点?

0 投票
2 回答
424 浏览

scala - 为什么 Scala 在使用按名称参数重载的情况下的行为与使用按值参数的情况不同?

鉴于此 Scala 代码:

调用 byval(5) 编译正确,但 byname 编译失败:

为什么?我希望在重载方面观察到按值和按名称参数的相同行为……如何解决?

0 投票
1 回答
54 浏览

language-agnostic - 依靠自动传递引用来改变对象可以吗?

我在这里使用 Python 工作(我认为这实际上是按名称传递的),但只要方法参数的行为相似,这个想法就与语言无关:

如果我有这样的功能:

并这样称呼它,

new_dict将是 的修改版本some_dict,但some_dict将被修改。

假设像我的示例中的 dict 这样的可变结构几乎总是同样小,并且性能不是问题(在应用程序中,我正在获取抽象对象并更改为不同服务的 SOAP 请求,其中 SOAP 请求将接受订单比重新格式化每个服务的数据要长得多),这样可以吗?

destination这些函数中(有几个,它不仅仅是像我的示例中那样的实用函数)将始终是可变的,但我想明确一点:函数的返回值表示对您传递的参数进行确定性计算的结果我不喜欢使用 out 参数,但是在将可变结构传递给函数时,在 Python 中并没有真正的解决方法。我考虑了几个选项:

  • 复制将要变异的参数,以保留原始参数

    我必须在我对其进行变异的每个函数中复制参数,这看起来很麻烦,就像我只是重复了很多。另外,我认为我实际上不需要原始文件,返回对我已经拥有的变异对象的引用似乎很麻烦。

  • 只需将其用作输入/输出参数

    我不喜欢这个,这个函数在做什么并不是很明显,而且我认为它很难看。

  • 创建一个会自动复制参数的装饰器

    好像有点矫枉过正

那我做的好吗?我觉得我在隐藏一些东西,未来的程序员可能会认为基于我调用函数的方式保留了原始对象(获取其结果而不是依赖于它改变原始对象的事实)。但我也觉得任何替代方案都会很混乱。有没有更优选的方式?请注意,由于软件的工作方式,向表示抽象数据的类添加 mutator 样式的方法并不是一个真正的选择(我必须添加一个方法来将该数据结构转换为我们的每个服务的相应 SOAP 结构也发送该数据-当前翻译逻辑位于每个服务的单独包中)

0 投票
2 回答
223 浏览

scala - 如何将无操作处理程序设置为按名称参数?

我定义了一个treeNode创建节点的方法,它可以有子节点。简化的代码是:

当我使用这种方法时,我必须写:

您可以看到它们没有子节点的叶节点,但它们必须有一个空块{}

有没有办法给参数children: => Any一个默认的无操作值,我可以把代码写成:

帮助~

0 投票
2 回答
2493 浏览

parameter-passing - 按名称传递和按值传递结果

对于我的编程语言课程,我试图了解 pass-by-name 和 pass-by-value-result 的工作原理。我意识到这些在主流语言中几乎没有使用,但我想了解它们是如何工作的。例如(与语言无关):

对于 pass-by-value-result 和 pass-by-name 调用交换之后 val 和 list 的值是什么。

一个解释也会很棒。

根据我的推断,它得到了值结果:val=2,list={1,1,3,4,5} 和名称:val=3,list={1,2,1,4,5}。我对这些结果非常不确定。

当传递一个数组而不是单个 int 时,它是否会改变这两种方法的工作方式?感谢您提前提供任何帮助。

0 投票
1 回答
974 浏览

scala - 按名称类型参数

想象一下,我有以下类定义:

我想做以下事情

但编译器因“此处不允许使用名称参数类型”而失败

如何使用按名称类型作为泛型方法的类型参数?

0 投票
3 回答
31473 浏览

python - Python:通过名称和 kwargs 传递参数

在python中我们可以这样做:

然后我们可以调用函数并通过参数名称传递参数:

此外,我们可以这样做:

所以我想知道是否可以将这两种方法结合起来,例如:

一般来说,我们可以做哪些组合?

感谢并为我的愚蠢问题感到抱歉。