朱莉娅功能宣言风格

时间:2018-01-27 23:17:24

标签: function syntax julia

在Julia,我知道有三种定义命名多线函数的方法:

1

function f(x, y)
    ...
end

2

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

3

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

他们似乎都产生了同样的结果 有什么区别吗?应该使用哪一个?为什么?

2 个答案:

答案 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