function somefun()
x::Int = 1
x = 0.5
end
编译时没有任何警告。当然,调用它会产生 InexactError:Int64(0.5)。问题:你能强制执行编译时检查吗?
从这个意义上说,Julia 是一种动态语言。所以,不,如果不先运行函数,您似乎无法检测赋值结果是否会导致此类错误,因为这种类型检查是在运行时完成的。
我自己也不确定,所以我把这个函数包装在一个模块中,在没有运行该函数的情况下强制(预)编译,结果是没有抛出任何错误,这证实了这个想法。 (看here https://stackoverflow.com/a/50627721/4183191如果你想明白我的意思)。
说了这么多,来回答一下spirit你的问题:有没有办法避免这种晦涩的运行时错误以意想不到的方式蔓延?
就在这里。考虑以下两个几乎等效的函数:
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)
您可能会想,这有什么大不了的,我们用一个错误换成了另一个错误。但这种情况并非如此。在第一种情况下,您不知道您的输入会导致问题,直到在函数中使用它为止。而在第二种情况下,您实际上是在以下位置强制执行类型检查:calling功能。
这是利用 Julia 优雅的类型检查系统“按契约”编程的一个简单示例。看按合同设计 https://en.wikipedia.org/wiki/Design_by_contract了解详情。
所以你的问题的答案是,是的,如果你重新考虑你的设计并遵循良好的编程实践,这样就能尽早发现这种错误,那么你就可以避免它们稍后在难以修复的模糊场景中发生或检测。
Julia 手册提供了时尚指南 https://docs.julialang.org/en/v1/manual/style-guide/index.html这也可能有帮助(我上面给出的例子就在顶部!)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)