在Julia,我知道有三种定义命名多线函数的方法:
1
function f(x, y)
...
end
2
f = function(x, y)
...
end
3
f(x, y) = begin
...
end
他们似乎都产生了同样的结果 有什么区别吗?应该使用哪一个?为什么?
答案 0 :(得分:8)
1和3在功能上是相同的,但在风格上优选1。 “简短函数声明”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/。
答案 1 :(得分:1)
定义1和3是等效的(区别仅在于样式,通常首选选项1)。它们定义了函数f
,您可以为其实现多个方法(https://docs.julialang.org/en/latest/manual/methods/)。
定义2创建一个匿名函数并将其分配给全局变量f
。我不会一般鼓励它。
如果您使用名称f
在其他函数内调用此类函数,则结果将不是类型稳定的(必须解析来自全局范围的变量f
)。匿名函数通常用于名称不重要的情况。
实际上还有另外两种方法可以定义多行匿名函数(再次 - 我不鼓励它但是为了完整性而显示它):
f = x -> begin
...
end
和
f = identity() do x
...
end