function - 函数可以在 Julia 中是本地的吗?这意味着什么?
问题描述
根据使用 Julia 1.1 的 Julia repl,这是有效的 Julia:
julia> local function f()
5
end
(::getfield(Main, Symbol("#f#8"))) (generic function with 1 method)
在说模块中具有本地功能是什么意思?是私人的还是公开的?默认情况下,不是所有函数都在声明它们的范围内声明为本地函数吗?如果是这种情况,local 关键字对于函数来说是多余的吗?
解决方案
在说模块中具有本地功能是什么意思?
我认为应该禁止这种语法。它没有记录它的作用。我在这里开启了一个讨论来澄清这个问题。
是私人的还是公开的?
这个语法——据我所知——定义了一个没有引入到模块的全局方法表中的函数。因此,这个定义实际上类似于定义一个匿名函数,所以你可以这样做:
julia> x = (local f() = 1)
(::getfield(Main, Symbol("#f#3"))) (generic function with 1 method)
julia> x()
1
默认情况下,不是所有函数都在声明它们的范围内声明为本地函数吗?
是的。不允许将方法从本地范围添加到全局方法表。唯一的方法是使用eval
通常不推荐在普通代码中使用的方法。
如果是这种情况,local 关键字对于函数来说是多余的吗?
不,它不是完全冗余的,因为有时在嵌套的局部作用域中需要它(通常local
在任何变量名的局部作用域中都需要它)。看这个例子:
julia> function f1()
f2() = 10
for i in 1:2
f2() = i
println(f2())
end
end
f1 (generic function with 1 method)
julia> f1()
ERROR: UndefVarError: i not defined
Stacktrace:
[1] f1() at .\REPL[3]:2
[2] top-level scope at none:0
julia> function f1()
f2() = 10
for i in 1:2
local f2() = i
println(f2())
end
end
f1 (generic function with 1 method)
julia> f1()
1
2
编辑
正如 Discourse 中所述,这里是对这个问题的解释https://github.com/JuliaLang/julia/issues/10472#issuecomment-321584501在 GitHub 上。
总而言之 - 它像我假设的那样工作,技术原因是,如果 Julialocal
在全局范围内看到关键字,则会创建一个隐式本地范围,因此值可以泄漏出这个范围,但不会泄漏变量绑定。
推荐阅读
- regex - 根据 Postgres 中列中的特定模式连接列值
- javascript - 使用 JEST 测试使用 fs 读取的文件
- c# - 如何动态更改文本颜色取决于使用 xaml for UWP 应用程序的值
- laravel-nova - Laravel Nova 工具 - 向 Vue 发送元数据
- java - 有条件地将项目添加到 HashMap 的有效方法
- dart - Dart - 从列表中获取最近(更大)的值?
- postgresql - Postgresql 启动错误:“无法刷新脏数据:输入/输出错误”
- javascript - 显示国家/地区城市名称并在两个字段中仅显示国家名称
- vue.js - 如何在带有 vue-json-schema-form 的 json-schema 中使用 $ref?
- flutter - Flutter 这个函数的返回类型是 'Future
',但不以 return 语句结尾