julialang:可以(应该)在编译时捕获这种类型错误吗?

ㄈㄟㄈ*_*ㄟㄈㄟ 5 typechecking julia

function somefun()
    x::Int = 1
    x = 0.5
end
Run Code Online (Sandbox Code Playgroud)

编译时没有任何警告。当然,调用它会产生 InexactError:Int64(0.5)。问题:你能强制执行编译时检查吗?

Tas*_*nou 4

从这个意义上说,Julia 是一种动态语言。所以,不,如果不先运行函数,您似乎无法检测赋值结果是否会导致此类错误,因为这种类型检查是在运行时完成的。

我自己也不确定,所以我把这个函数包装在一个模块中,在没有运行该函数的情况下强制(预)编译,结果是没有抛出任何错误,这证实了这个想法。(如果您想了解我的意思,请参阅此处)

话虽如此,回答你的问题的实质是:有没有办法避免这种晦涩的运行时错误以意想不到的方式蔓延?

就在这里。考虑以下两个几乎等效的函数:

function fun1(x     ); y::Int = x; return y; end;
function fun2(x::Int); y::Int = x; return y; end;

fun1(0.5)   # ERROR: InexactError: Int64(0.5)
fun2(0.5)   # ERROR: MethodError: no method matching fun2(::Float64)
Run Code Online (Sandbox Code Playgroud)

您可能会想,这有什么大不了的,我们用一个错误换成了另一个错误。但这种情况并非如此。在第一种情况下,您不知道您的输入会导致问题,直到在函数中使用它为止。而在第二种情况下,您在调用函数时有效地强制执行类型检查。

这是利用 Julia 优雅的类型检查系统“按契约”编程的一个简单示例。有关详细信息,请参阅按合同设计。

所以你的问题的答案是,是的,如果你重新思考你的设计并遵循良好的编程实践,这样这种错误就可以尽早被发现,那么你可以避免它们稍后在难以修复的模糊场景中发生或检测。

Julia 手册提供了风格指南,可能也会有所帮助(我上面给出的示例就在顶部!)。