Юлия Переменная сфера

Я пытаюсь использовать некоторые глобальные переменные (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!

Другие вопросы по тегам