gpt4 book ai didi

julia - Julia 中类型稳定的 do-blocks

转载 作者:行者123 更新时间:2023-12-05 00:45:43 25 4
gpt4 key购买 nike

我想从带有 do-block 的文件中读取数据。使用 do-block 非常重要,因为即使在读取文件期间发生错误,我也需要确保文件被正确关闭。文件中的数据应转换为作为参数提供的类型。我真正的用例是使用 NetCDF 文件,但我可以用纯文本文件重现类型稳定性问题。

假设,有一个文件 file.txt与内容 123 , 可以通过以下方式创建:

 write("file.txt","123")

当我按如下方式加载没有 do-block 的文件时,结果是类型稳定的:
function loadfile1(T)
f = open("file.txt")
data = parse(T,readline(f))
close(f)
return data
end
@code_warntype正确推断我得到 Float32其结果:
@code_warntype loadfile1(Float32)
Body::Float32
[...]

但是,以下变体:
function loadfile2(T)
f = open("file.txt") do f
return parse(T,readline(f))
end
end

产生一个类型不稳定的代码:
 @code_warntype loadfile2(Float32)
Body::Any
9 1 ─ %1 = %new(getfield(Main, Symbol("##842#843")){DataType}, T)::getfield(Main, Symbol("##842#843")){DataType} │
│ %2 = Main.open::Core.Compiler.Const(open, false) │
│ %3 = invoke Base.:(#open#294)($(QuoteNode(Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}()))::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, %2::Function, %1::getfield(Main, Symbol("##842#843")){DataType}, "file.txt"::String)::Any
└── return %3

我该如何修改函数 loadfile2 (使用 do-block)并仍然获得类型稳定的结果?

最佳答案

它可以移动 T到签名中的类型规范:

function loadfile2(::Type{T}) where T
f = open("file.txt") do f
return parse(T,readline(f))
end
end

这样 T在编译时已知。

关于julia - Julia 中类型稳定的 do-blocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56338432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com