今天早些时候Lyndon's提问:
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
的{{1}}。
湾
const
为什么在{strong> 3 上将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值> 2
c。
特别是,这使我无法做到:
x
我打算将此作为一种模拟“强类型”的方式,关于Lyndon的"counterexample" comment,但它适用于我,因为这个函数在第2行而不是第3行打破,正如我预期的那样它来。
导致此行为的原因是什么?这会被视为错误还是故意行为?
除了命名约定之外,是否有更可接受的方法来防止传递给函数的参数改变其类型? (因为,是否有一个定义和适当的方法来执行此操作:我不是在解决方法之后,例如创建一个将x转换为不可变类型等的包装器)
修改
到目前为止,这是允许我在函数中强制执行const的唯一变体,但它仍然需要引入一个新的变量名:
function f(x::Float64)
const x = x; # ensure x cannot change type, to simulate "strong typing"
x = "This should throw an error";
end
但即便如此,错误只是抱怨“从字符串到浮点的无效转换”而不是“对常量的无效重新定义”