在Julia中,`function`和`let`块之间有什么区别?

4
在Julia中,使用这两种或三种方式创建函数是否有任何区别呢?
- 使用关键字function创建函数。
function g1(x)
   # compute something, store it in `result`
   return result # (return keyword is optional)
end

使用关键字let
g2(x) = let
   # compute something, store it in `result`
   return result # (return keyword is optional)
end

使用关键字 begin
g3(x) = begin
   # compute something, store it in `result`
   return result # (return keyword is optional)
end

以下答案是:这三个定义完全等同编辑:澄清问题,并强调答案。
1个回答

2
请注意,let 变体也会创建一个函数。因此,你也可以这样写:
g2(x) = begin
   # compute something, store it in `result`
   result
end

为了达到相同的效果。
原因是在这里的等号后面的所有内容都在g2函数范围内,所以无论你使用begin-end还是let-end,表达式都在这个范围内。let变体创建了一个额外的硬范围,但它并没有改变任何东西,因为在函数范围内没有任何不在let范围内的内容。
如果let-end在全局范围内,它与begin-end会有所不同,但在你的例子中,你将其引入到函数范围内。

所以一个人可以用function(可选的最后返回),和end,或者用= begin,没有返回,end,或者用= let,没有返回,end,来创建完全相同的函数。这三种方式是完全等效的。对吗? - undefined
更正:returnletbegin 块中也是允许的,因为它们位于函数定义内部。 - undefined
在这种情况下,它们在行为上是等效的。正如Julia手册所指出的:“在赋值形式中,函数体必须是一个单独的表达式,尽管它可以是一个复合表达式”。是的 - return 在所有选项中都是允许的,就像在函数范围内的任何地方一样。您可以使用@code_warntype宏来验证您是否得到相同的结果。 - undefined

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