朱莉娅函数命名:何时应该添加感叹号?

3
朱莉亚风格指南规定,“修改其参数”的函数应以!结尾。
然而,以下情况如何处理:
  1. 修改其参数,但在返回之前将其恢复到原始状态的函数?

  2. 返回一个Task,当执行时修改参数的函数?

  3. 返回这样一个Task,但当它完成时,参数将被恢复到其原始状态?

这些函数的名称应该以!结尾吗?
作为一个例子,考虑使用Knuth的Dancing Links算法找到精确覆盖的模块 CoverSet。它实现了一种类型CoverSet,可以用子集填充,然后查询第一个精确覆盖。
set = CoverSet()
push!(set, [1, 2])
push!(set, [2, 3])
push!(set, [3, 4])
push!(set, [4, 1])

find_exact_cover(set) # returns [1, 3]

find_exact_cover函数在搜索解决方案时会暂时修改set中的数据,但是当find_exact_cover返回时,set将恢复到原始状态。它应该改名为find_exact_cover!吗?

同样地,exact_cover_producer返回一个Task,用于生成所有的确切覆盖,但是当该Task完成时,set将被还原:

for cover in exact_cover_producer(set)
  println(cover) # prints [1,3] and [2,4]
end
# By now, set is restored.

它应该是exact_cover_producer!吗?


我知道这可能被认为是主观的,所以让我澄清一下我的要求:我想知道Julia社区是否有关于这个的约定,并且最好也提供标准库或任何使用其中任一风格的包的示例。


2
当我在Julia中看到一个没有感叹号的函数时,我会假设我传递的所有参数在调用完成后都不会改变。函数内部发生的事情不是我的关注点。 - Jeremy Wall
1个回答

2
例如,请参见Julia提交e7ce4cba44fa3b508fd50e0c3d03f6bc5a7a5032处的讨论:当前惯例是,如果函数更改了其参数之一的值,则该函数是可变的,因此将添加!
(但是,也有一些稍微宽泛的定义的理由;请参见上述讨论。)

谢谢您的回复,但这并没有完全回答我的问题。正在考虑的参数甚至可能没有定义工作的==(就像我的例子一样)。但是,即使我们将定义扩大到相等的外部可见行为(通过某个定义的接口),这也不会回答我的任何观点,因为它对何时应该保持相等毫无意义。 最接近的部分是关于并发的部分,但那是模糊的,远离惯例。无论如何,这个链接很有用,所以+1。 - user4235730

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接