朱利亚的类型稳定的do-blocks

时间:2019-05-28 08:55:13

标签: julia type-stability

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

假设有一个文件78945,其内容为 fs.appendFileSync('file_name').toString().split('\n').forEach(function(line){ app.console.log("called append"); var sEntry = line.split("="); if (sEntry.length == 2) { if (sEntry[0] == "LINE_IAM_INTERESTED") { app.console.log("found one!!!!"); } } }); ,可通过以下方式创建:

file.txt

当我按如下所示加载没有do-block的文件时,结果是类型稳定的:

123

write("file.txt","123") 正确推断出我得到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 (带有do-block)并仍然得到类型稳定的结果?

1 个答案:

答案 0 :(得分:5)

它可以将T移到签名中的类型说明:

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

这样T在编译时就知道了。