无法在Julia中自动将SharedArray转换为数组?

时间:2016-07-13 18:24:02

标签: types casting type-conversion julia

所以我在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)

2 个答案:

答案 0 :(得分:3)

Julia没有自动转换。

Docs:

  

...... 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()函数。这对我有用。