Как @Michael Paul и @crstnbr уже ответили в комментариях, правила области видимости были изменены (Область действия переменных в Julia). Циклы for
и while
вводят новую область видимости и не имеют доступа к внешним (глобальным) переменным. Вы можете получить доступ к области с помощью ключевого слова global
, но рекомендуемый рабочий процесс заключает ваш код в функции.
Одним из преимуществ нового дизайна является то, что пользователь вынужден избегать таких глобальных конструкций, которые напрямую влияют на производительность функций, которые не могут быть стабильными по типу при доступе к глобальным переменным.
Одним из недостатков является путаница при экспериментировании с REPL и видении таких ошибок.
На мой взгляд, новое поведение является более чистым с точки зрения предсказуемости. Тем не менее, это была очень жесткая и продолжительная дискуссия в рамках всего сообщества Джулии ;)
В настоящее время обсуждается, будет ли REPL изменен, чтобы вести себя как старый, используя let
-обертки: https://github.com/JuliaLang/julia/issues/28789 Это то, что нецелесообразно делать вручную (гораздо сложнее, чем использовать ключевое слово global
), см. пример Стефана Карпински. : 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
person
tamasgal
schedule
27.08.2018