Julia如何避免函数必须在开头声明才能调用的问题?
Julia 采用顺序解释执行模型,和 C# 这类先全量扫描编译单元所有符号再执行的静态编译语言、以及带变量提升特性的 JS 都有差异,默认执行到函数调用语句时,必须已经完成对应函数的定义,否则就会抛出未声明错误。
解决方案
方案1:前向声明函数
只需要在代码顶部先声明你要放在后面实现的函数名,不需要写实现逻辑,后面再补全函数定义即可正常调用:
# 顶部先做前向声明 function SelectValue end function SelectOperation end function makeoperation end function IsItOver end # 主逻辑直接放在前面 final = true while final val1 = SelectValue() val2 = SelectValue() oper = SelectOperation() makeoperation(val1, val2, oper) readline() println("Do you want to make another operation? (Y/N)") final = IsItOver() end # 后面再写所有函数的具体实现 function SelectValue()::Int64 fin = false println("Enter a valid, whole numerical value") while !fin myvalue = readline() if tryparse(Int64, myvalue) === nothing println("invalid value; entered '" * myvalue * "', expected valid Int64 value") else fin = true myvalue = parse(Int64, myvalue) end end return myvalue end # 其他函数的实现也放在这
方案2:将主逻辑封装为函数(更推荐)
这是 Julia 社区的最佳实践,既可以解决函数调用顺序问题,还能避免全局作用域带来的性能损耗:
函数在定义阶段不会执行内部逻辑,只有被调用时才会解析内部语句,因此只要调用主函数之前,所有依赖的辅助函数已经定义完成即可,主函数本身可以放在代码最顶部:
# 主函数放在最前面,内部可以调用任何后续定义的函数 function main() final = true while final val1 = SelectValue() val2 = SelectValue() oper = SelectOperation() makeoperation(val1, val2, oper) readline() println("Do you want to make another operation? (Y/N)") final = IsItOver() end end # 所有辅助函数的实现放在主函数之后、主函数调用之前 function SelectValue()::Int64 fin = false println("Enter a valid, whole numerical value") while !fin myvalue = readline() if tryparse(Int64, myvalue) === nothing println("invalid value; entered '" * myvalue * "', expected valid Int64 value") else fin = true myvalue = parse(Int64, myvalue) end end return myvalue end # 其他函数的实现也放在这 # 最后调用主函数 main()
内容的提问来源于stack exchange,提问作者Theory
相关产品推荐
相关产品推荐

