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

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

0 голосов
/ 31 августа 2018

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

0 голосов
/ 31 августа 2018

Вы должны объявить переменные, которые вы определили в глобальной области видимости, и присвоить в локальной области видимости цикла как 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? для дальнейшего объяснения правил определения области в Julia.

0 голосов
/ 31 августа 2018

Вы действительно пытались объявить переменные в верхней части вашего модуля кода в соответствии с предупреждающими сообщениями вроде этого?

global r
global m
global n

Добро пожаловать в Stackoverflow!

...