朱莉娅函数声明风格

8
在Julia中,我知道有三种定义具名多行函数的方法:

1.

function f(x, y)
    ...
end

2.

f = function(x, y)
    ...
end

3.

f(x, y) = begin
    ...
end

他们似乎都会产生相同的结果。
有什么区别吗?应该选择哪一个以及为什么?
2个回答

11

1和3在功能上是相同的,但是从风格上讲,更倾向于使用1。 "short form function declaration" f(x,y) = … 通常用于一行定义 - 即没有begin块。

2则不同,它创建了一个匿名函数,并将其赋值给f。请注意,与1和3创建的绑定不同,您实际上可以将f重新分配为完全不同的内容。这意味着Julia不能假设f始终调用该函数,因此它无法进行任何正常的优化。现在,如果使用const f = function(x, y) …,那么f是一个常量绑定,应该类似于其他声明。但请注意,f仍然只是一个绑定到匿名函数的绑定-函数本身不知道它的名称!因此,它将打印为#1(generic function with 1 method)而不是f(generic function with 1 method)

有关详细信息,请参见https://docs.julialang.org/en/stable/manual/functions/


3

定义1和3是等价的(区别只在于样式,通常情况下选择选项1)。它们定义了函数f,您可以实现多个方法(https://docs.julialang.org/en/v1/manual/methods/)。

定义2创建一个匿名函数并将其分配给全局变量f。一般情况下,我不鼓励这样做。

如果您使用名称f在其他函数中调用这样的函数,则结果将不具有类型稳定性(必须解析来自全局范围的变量f)。匿名函数通常用于名称不重要的情况。

实际上,还有两种定义多行匿名函数的方式(再次强调-我不鼓励这样做,但为了完整起见展示):

f = x -> begin
    ...
end

并且

f = identity() do x
    ...
end

还有二进制中缀函数定义语法,例如:import Base: +; s1::String + s2::String = s1 * s2; "foo" + "bar" # 返回 "foobar" - HarmonicaMuse
1
定义2创建了一个匿名函数并将其分配给全局变量f。一般情况下,我不会鼓励这样做。不,那是多行匿名函数语法。我强烈建议使用它而不是-> begin,希望我永远不会看到identity() do x - Chris Rackauckas
不幸的是,Julia手册的引用已经更改。我认为旧的样式更好,但现在链接是:https://docs.julialang.org/en/v1/manual/methods/ - PatrickT

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