所以我在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)
答案 0 :(得分:3)
...... Julia属于“无自动升级”类别:...函数的参数永远不会自动转换。
有时可能看起来像是在进行自动转换,
但他们不是。只是定义了一个方法来进行转换。
通常作为后备,用于::Any
类型的参数(这就是它对算术运算符的作用)。
有一个定义的方法:Base.convert(::Type{Float64}, Int64)
Base.convert(Float64, 6)
> 6.0
有效。
Type-asserts是断言事物具有特定类型。
写val::Type
。
它们可用于鼓励类型稳定性,并帮助推断。
并强制(作为断言)事情就像你期望的那样。
现在让我们使用 type-asserts 进行一些分配。
a = 6 ::Float64
>ERROR: TypeError: typeassert: expected Float64, got Int64
a = 6.0 ::Float64
>6.0
a = convert(Float64,6) ::Float64
>6.0
因此,仅仅定义类型之间的转换是不够的。
需要在类型断言之前将调用convert
添加到代码中,以便进行转换。
答案 1 :(得分:0)
尝试使用Array()函数。这对我有用。