我想从带有do-block的文件中读取数据。使用do块非常重要,因为即使在读取文件期间发生错误,我也必须确保正确关闭文件。文件中的数据应转换为作为参数提供的类型。我真正的用例是使用NetCDF文件,但是我可以重现纯文本文件的类型稳定性问题。
假设有一个file.txt包含content 的文件123,可以使用以下文件创建:
write("file.txt","123")
Run Code Online (Sandbox Code Playgroud)
当我按如下所示加载没有do-block的文件时,结果是类型稳定的:
function loadfile1(T)
f = open("file.txt")
data = parse(T,readline(f))
close(f)
return data
end
Run Code Online (Sandbox Code Playgroud)
@code_warntype正确推断我得到Float32的结果是:
@code_warntype loadfile1(Float32)
Body::Float32
[...]
Run Code Online (Sandbox Code Playgroud)
但是,以下变体:
function loadfile2(T)
f = open("file.txt") do f
return parse(T,readline(f))
end
end
Run Code Online (Sandbox Code Playgroud)
产生类型不稳定的代码:
@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
Run Code Online (Sandbox Code Playgroud)
如何修改函数loadfile2(带有do-block)并仍然获得类型稳定的结果?
如何获取向量的唯一元素的索引?
例如,如果你有一个向量v = [1,2,1,3,5,3],那么唯一元素是[1,2,3,5] (输出unique)并且它们的索引是ind = [1,2,4,5].什么功能,可以让我计算ind,这样v[ind] = unique(v)?
是否可以在不更新其他软件包的情况下在 Julia 1.0 中安装软件包?例如,如果安装ClusterManagers,则包IJulia(以及其他)会更新。该包ClusterManagers没有依赖项。
(v1.0) pkg> add ClusterManagers
Resolving package versions...
Installed IJulia ????????????? v1.12.0
Installed ClusterManagers ???? v0.3.2
Installed ColorTypes ????????? v0.7.5
Installed OrderedCollections ? v1.0.1
Updating `~/.julia/environments/v1.0/Project.toml`
[34f1f09b] + ClusterManagers v0.3.2
[7073ff75] ? IJulia v1.11.1 ? v1.12.0
Updating `~/.julia/environments/v1.0/Manifest.toml`
[34f1f09b] + ClusterManagers v0.3.2
[3da002f7] ? ColorTypes v0.7.4 ? v0.7.5
[7073ff75] ? IJulia v1.11.1 ? v1.12.0
[bac558e1] ? OrderedCollections v1.0.0 ? v1.0.1
Building IJulia ? `~/.julia/packages/IJulia/4VL8h/deps/build.log`
Run Code Online (Sandbox Code Playgroud)
我在 Linux 上使用 Julia 1.0.0(官方https://julialang.org/release)。