Юлия Переменная сфера
Я пытаюсь использовать некоторые глобальные переменные (m, n, r) в цикле while, но julia 1.0.0 говорит мне, что эти переменные не определены. Код работает с julia 0.7.0, с некоторыми предупреждениями. Это код, который я использую (да, он плохо написан, я надеюсь, что это не проблема. Я удалил println
заявление ради простоты)
m = readline()
n = readline()
m = parse(Int, m)
n = parse(Int, n)
r = m % n
while (r > 0)
println( "m: $(m) n: $(n) r: $(r)" )
r = m % n
m = n
n = r
end
Это результаты с Юлией 1.0.0:
ERROR: LoadError: UndefVarError: m not defined
Stacktrace:
[1] top-level scope at euclide.jl:11 [inlined]
[2] top-level scope at ./none:0
[3] include at ./boot.jl:317 [inlined]
[4] include_relative(::Module, ::String) at ./loading.jl:1038
[5] include(::Module, ::String) at ./sysimg.jl:29
[6] exec_options(::Base.JLOptions) at ./client.jl:229
[7] _start() at ./client.jl:421
in expression starting at euclide.jl:10
А с юлией 0.7.0:
┌ Warning: Deprecated syntax `implicit assignment to global variable `r``.
│ Use `global r` instead.
└ @ none:0
┌ Warning: Deprecated syntax `implicit assignment to global variable `m``.
│ Use `global m` instead.
└ @ none:0
┌ Warning: Deprecated syntax `implicit assignment to global variable `n``.
│ Use `global n` instead.
└ @ none:0
Код работает с julia 0.7.0, но почему он не работает с версией 1.0.0?
2 ответа
Вы должны объявить переменные, которые вы определили в глобальной области видимости, и назначить в цикле локальную область видимости как global
внутри цикла, как это:
m = readline()
n = readline()
m = parse(Int, m)
n = parse(Int, n)
r = m % n
while (r > 0)
println( "m: $(m) n: $(n) r: $(r)" )
global r = m % n
global m = n
global n = r
end
Причина, по которой вы должны это сделать, заключается в том, что while
циклы вводят новую локальную область видимости, поэтому без global
назначение ключевых слов, как m = n
говорит Юлии, что m
является локальной переменной внутри while
цикл так, то в строке println( "m: $(m) n: $(n) r: $(r)" )
Юлия решает, что m
еще не определено.
См. Также https://docs.julialang.org/en/latest/manual/variables-and-scoping/ и почему это назначение внутри цикла завершается неудачно в Julia 0.7 и 1.0? для дальнейшего объяснения правил определения объема в Юлии.
Вы на самом деле пытались объявить переменные в верхней части вашего модуля кода в соответствии с предупреждающими сообщениями, как это?
global r
global m
global n
Добро пожаловать в Stackru!