虽然没有全球

While without global

这段代码来自 JuliaBoxTutorials

myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
i = 1;

while i <= length(myfriends)
    friend = myfriends[i]
    println("Hi $friend, it's great to see you!")
    i += 1
end

当 运行 使用 Julia v1.0

时出现此错误
UndefVarError: i not defined

Stacktrace:
 [1] top-level scope at ./In[12]:5 [inlined]
 [2] top-level scope at ./none:0

但是当 i += 1 被替换为 global i += 1 时它起作用了。我想这在 v0.6 中仍然有效,一旦本周五新的 Julia 介绍发布,本教程将进行调整。

我只是想知道,是否可以在不声明全局变量的情况下进行 while 循环?

由于@Michael Paul 和@crstnbr 已在评论中回复,范围规则已更改 ()。 forwhile 循环引入了一个新的作用域并且无法访问外部(全局)变量。您可以使用 global 关键字获得范围访问权限,但推荐的工作流程是将您的代码包装在函数中。

新设计的一个好处是,用户被迫避免这种直接影响函数性能的全局构造——当他们访问全局变量时,它们的类型不能稳定。

一个缺点是在 REPL 中进行实验并看到此类错误时会感到困惑。

在我看来,就可预测性而言,新行为更为清晰。然而,在整个 Julia 社区中,这是一场非常艰难且漫长的讨论 运行 ;)

目前正在讨论是否可以通过使用 let-wraps 将 REPL 更改为像旧版本一样运行:https://github.com/JuliaLang/julia/issues/28789 这是手动完成的事情不切实际(比使用 global 关键字复杂得多),请参阅 Stefan Karpinski 的示例:https://github.com/JuliaLang/julia/issues/28789#issuecomment-414666648

无论如何,为了完整起见(虽然我不建议这样做)这里是一个使用global:

的版本
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
i = 1;
N = length(myfriends)    

while i <= N  # you cannot even call a function here
              # with a global, like length(myfriends)
    global i, myfriends
    friend = myfriends[i]
    println("Hi $friend, it's great to see you!")
    i += 1
end

但是请注意,这也是完全有效的:

myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]

greet(friend) = println("Hi $friend, it's great to see you!")

for friend in myfriends
    greet(friend)
end

我发现这在 Julia v1.0 中有效:

let 
    myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
    i = 1;

    while i <= length(myfriends) # this function here seems to work no problem
        friend = myfriends[i]
        println("Hi $friend, it's great to see you!")
        i = i + 1 # gives syntax error when prefixed with global 
    end
end

事实上,如果我试图在 while 循环中使 i 成为全局 :),它会给我一个语法错误。