【问题标题】:Usage of Array of abstract types in JuliaJulia 中抽象类型数组的使用
【发布时间】:2016-06-13 13:48:03
【问题描述】:

我正在探索 Julia,所以我是新手。现在我正在探索它的强类型特性。我意识到的是,我看不到数组抽象类型的用法。让我用一个例子来解释:

假设我想创建一个接受实数数组的函数,无论其具体类型如何。我会使用:

function f(x::Array{Real})
  # do something
end

如果不引发f has no method matching f(::Array{Float64,1}),则永远无法调用此函数

我想调用f([1,2,3])f([1.,2.,3.]),只要元素的类型是Real。

我了解到您可以提升或转换数组(例如 f(convert(Array{Real}, [1, 2, 3])) 左右),但我认为这种方式非常不动态且乏味。

除了摆脱强类型行为之外,还有其他选择吗?

谢谢。

【问题讨论】:

  • 您可以定义一个参数函数:function f{T<:Real}(x::Array{T})。这将捕获f([1,2,3])f([1.,2.,3.])
  • 只是添加到@user3580870 评论:参数函数没有性能损失。这是 Julia 绝对不可或缺的功能。
  • 是的,感谢您的评论,您是对的。我也打算将此替代方案添加为“乏味的替代方案”,但我最终后悔了。这个解决方案也不能让我满意,因为它不能用于匿名函数。
  • 如果速度不是问题,您可以定义f(x::Array)并检查@assert eltype(x)<:Real,这是函数中的第一件事。

标签: arrays julia strong-typing


【解决方案1】:

要通过@user3580870 扩展解决方案,您还可以使用typealias 使函数定义更简洁:

typealias RealArray{T<:Real} Array{T}
f(x::RealArray) = "do something with $x"

然后你也可以在匿名函数中使用类型别名:

g = (x::RealArray) -> "something else with $x"

【讨论】:

  • 对我来说绝对是最好的解决方案。谢谢:)
【解决方案2】:

由于自原始答案以来已更新,因此关键字typealias 已消失,因此@Matt B. 的解决方案现在将是

const RealArray{T<:Real} = Array{T}
f(x::RealArray) = "do something with $x"

为了完整起见,我将把它放在这里;)

【讨论】:

    【解决方案3】:

    您可以使用&lt;: subtype operator 显式执行此操作:

    function f(x::Array)
        return zero.(x)
    end
    
    function f(x::Array{<:Real})
        return one.(x)
    end
    
    @show f([1, 2])
    @show f([1.0, 2.0])
    @show f([1im, 2im])
    

    打印

    f([1, 2]) = [1, 1]
    f([1.0, 2.0]) = [1.0, 1.0]
    f([1im, 2im]) = Complex{Int64}[0+0im, 0+0im]
    

    【讨论】:

    • 对你的答案添加一些解释。
    猜你喜欢
    • 1970-01-01
    • 2019-02-05
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多