为什么在这些朱莉娅函数中不遵守常量?

时间:2017-02-23 17:15:04

标签: const julia strong-typing

今天早些时候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

但即便如此,错误只是抱怨“从字符串到浮点的无效转换”而不是“对常量的无效重新定义”

1 个答案:

答案 0 :(得分:6)

因为尚未实现本地范围中的const

https://github.com/JuliaLang/julia/issues/5148