我最近开始学习Julia,并且遇到了使用functionname!
(附加感叹号)的编码约定(如果函数在调用时更改了其自变量之一)。现在,我来自python,我通常认为这是理所当然的,更改对象的函数应该实现为类方法,而将对象用作常量的函数也可以实现为通常的函数调用。让我以一个示例进行演示:
在python中进行常规的列表分配,并使用它进行一些可能的函数调用:
>>> l = [2,1,3]
>>> sorted(l)
[1, 2, 3]
>>> l.sort()
>>> l
[1, 2, 3]
对我来说,从我的角度和经验来看,很直观地知道,第一个函数调用不会不更改列表本身,而是返回已排序的列表副本。另一方面,类方法调用确实会更改列表本身,希望甚至不必使用额外的内存等。
现在在Julia中,这两种不同的列表排序方法已实现为sort(l)
,它不会更改列表本身,但会返回已排序列表的副本,并且{ {1}}会更改列表本身,但不会创建副本。
现在我的问题是:在用Julia编写我自己的代码时,现在认为使我的编码风格适应Base库的约定是不言而喻的吗?或者这仅仅是纯粹的偏爱?当然,这个问题并不仅仅适用于Julia,因为我假设每个面向对象的编程语言都具有类似的“问题”,因为类可以使用其方法来实现类本身或“外部”功能的改变。打电话。
另外,使用这些样式中的一种相对于另一种样式有什么优点或缺点,或者它是否取决于函数本身,对于实现一种还是另一种有用?