【发布时间】:2016-07-13 18:24:02
【问题描述】:
所以我在 Julia 中使用了一个抱怨的库,因为它无法将 SharedArray 转换为普通数组。我什至尝试在 Base.convert() 中显式提供一个转换函数,以查看是否可以解决它,但它失败了。我很困惑为什么我的转换不起作用。
这里是转换函数:
convert(::Type{Array{Int64,1}}, x::SharedArray{Int64, 1}) = x.s
ERROR: TypeError: ensure_loaded: in typeassert, expected Array{Int64,1}, got SharedArray{Int64,1}
in rmse at .../.julia/v0.4/RecSys/src/als-wr.jl:105
我已经用库填写了ticket,但确实应该有一种方法来提交转换以解决这些问题,我对它为什么不起作用有点困惑。任何帮助将不胜感激。
更新:这是该问题的最低工作示例。愿它成为一个关于转换和提升之间区别的优秀教学工具:
function foo(input :: Vector{64})
nothing
end
#IN some other file...
function shoo(some_array :: SharedArray{Int64, 1}) #Still an error even with the conversion
a = some_array :: Vector
foo(a)
end
import Base.convert
convert(::Type{Vector}, x::SharedArray{Int64, 1}) = x.s
some_array = S = SharedArray(Int, 64, init = S -> S[Base.localindexes(S)] = myid())
shoo(some_array)
【问题讨论】:
-
等等,为什么在这种情况下必须添加到
Base.convert()?你已经可以做A = SharedArray(Int64, 5); B = convert(Array{Int64}, A); -
因为它会给出错误,并且添加 Base.convert() 可确保 Julia 可以自动将其转换为正确的类型而不会发出任何警告。转换函数可以自动应用,我很困惑为什么在这种情况下不能自动应用。
-
MWE 在这里会很棒。
-
这对 MWE 来说真的很棒。这将是一个很好的参考问题。
标签: types casting type-conversion julia