Что означает наличие локальной функции в скажем модуле?
Я думаю, что этот синтаксис должен быть запрещен.Не задокументировано, что он делает.Я открыл обсуждение здесь , чтобы прояснить этот вопрос.
Это приватно или публично?
Этот синтаксис - насколько я могуtell - определяет функцию, которая не введена в глобальную таблицу методов модуля.Поэтому по сути это определение похоже на определение анонимной функции, поэтому вы можете сделать что-то вроде этого:
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.
В итоге - это работает, как я и предполагал, и техническая причина заключается в том, что если Джулия видит ключевое слово local
в глобальной области видимости, создается неявная локальная область действия, поэтому значения могут вытекать из этой области, но не привязываться к переменным.