为什么在这些 julia 函数中不尊重 constness?
Why is constness not respected inside these julia functions?
今天早些时候由 问题提示:
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
关键字在这里没有按预期工作? (即,不允许将已声明为 const
的字符串分配给 y
)。
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
为什么在行 3 上将 x
定义为 const
会影响 [=17= 的值] 线上 2?
c.
特别是,这会阻止我做:
function f(x::Float64)
const x = x; # ensure x cannot change type, to simulate "strong typing"
x = "This should throw an error";
end
我打算提供这个作为模拟 "strong typing" 的方式,关于 Lyndon 的 ,但它适得其反,因为这个函数在第 2 行而不是第 3 行中断正如我所料。
是什么导致了这种行为?这会被视为错误或故意行为吗?
抛开命名约定,是否有更可接受的方法来防止传递给函数的参数改变其类型?
(如,是否有定义和适当的方法来执行此操作:我不是在寻找解决方法,例如创建一个将 x 转换为不可变类型的包装器等)
编辑:
到目前为止,这是唯一允许我在函数中强制执行常量的变体,但它仍然需要引入新的变量名:
julia> function f(x::Float64)
const x_const::Float64 = x;
x_const = "helle"; # this will break, as expected
end
但即便如此,错误只是抱怨 "invalid conversion from string to float" 而不是 "invalid redefinition of a constant"
因为 const
在本地范围内尚未实现:
今天早些时候由
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
关键字在这里没有按预期工作? (即,不允许将已声明为 const
的字符串分配给 y
)。
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
为什么在行 3 上将 x
定义为 const
会影响 [=17= 的值] 线上 2?
c.
特别是,这会阻止我做:
function f(x::Float64)
const x = x; # ensure x cannot change type, to simulate "strong typing"
x = "This should throw an error";
end
我打算提供这个作为模拟 "strong typing" 的方式,关于 Lyndon 的
是什么导致了这种行为?这会被视为错误或故意行为吗?
抛开命名约定,是否有更可接受的方法来防止传递给函数的参数改变其类型?
(如,是否有定义和适当的方法来执行此操作:我不是在寻找解决方法,例如创建一个将 x 转换为不可变类型的包装器等)
编辑:
到目前为止,这是唯一允许我在函数中强制执行常量的变体,但它仍然需要引入新的变量名:
julia> function f(x::Float64)
const x_const::Float64 = x;
x_const = "helle"; # this will break, as expected
end
但即便如此,错误只是抱怨 "invalid conversion from string to float" 而不是 "invalid redefinition of a constant"
因为 const
在本地范围内尚未实现: