Почему постоянство не соблюдается внутри этих функций Юлии?
Подсказано вопросом Линдона ранее сегодня:
A.
julia> function f1(x::Float64)
const y = x;
y = "This should throw an error since y is of constant type";
return y;
end
f1 (generic function with 1 method)
julia> f1(1.0)
"This should throw an error since y is of constant type"
Почему ключевое слово const
здесь работает не так, как ожидалось? (то есть запретить присвоение строки y
, которая была объявлена как const
).
B.
julia> function f2(x::Float64)
show(x);
const x = 1.;
end
f2 (generic function with 1 method)
julia> f2(1.0)
ERROR: UndefVarError: x not defined
Stacktrace:
[1] f2(::Float64) at ./REPL[1]:2
Почему определение x
как const
в строке 3 влияет на значение x
в строке 2?
С.
В частности, это мешает мне делать:
function f(x::Float64)
const x = x; # ensure x cannot change type, to simulate "strong typing"
x = "This should throw an error";
end
Я собирался предложить это как способ симуляции "сильной типизации", в отношении комментария Линдона "контрпримера" , но это обернулось против меня, так как эта функция прерывается в строке 2, а не в строке 3, Как я ожидал.
Что вызывает такое поведение? Будет ли это считаться ошибкой или преднамеренным поведением?
Помимо соглашений об именовании, существует ли более приемлемый способ предотвратить передачу аргумента в функцию от имея свой тип изменили?
(например, есть ли определенный и подходящий способ сделать это: я не ищу обходных путей, например, создание оболочки, которая преобразует x в неизменяемый тип и т. д.)
Редактировать:
Пока это единственный вариант, который позволяет мне применять константу в функции, но он все еще требует введения нового имени переменной:
julia> function f(x::Float64)
const x_const::Float64 = x;
x_const = "helle"; # this will break, as expected
end
Но даже тогда ошибка просто жалуется на " недопустимое преобразование строки в float" вместо "недопустимого переопределения константы"