我想从带有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)并仍然得到类型稳定的结果?
答案 0 :(得分:5)
它可以将T
移到签名中的类型说明:
function loadfile2(::Type{T}) where T
f = open("file.txt") do f
return parse(T,readline(f))
end
end
这样T
在编译时就知道了。