【问题标题】:Type inheritance in function arguments函数参数中的类型继承
【发布时间】:2018-04-18 19:03:45
【问题描述】:

我在输入函数时遇到问题,我已经设法编写了解释问题的最少代码:

immutable Inner{B<:Real, C<:Real}
a::B
c::C
end

immutable Outer{T}
    a::T
end

function g(a::Outer{Inner})
    println("Naaa")
end

inner = Inner(1, 1)
outer = Outer(inner)

g(outer)

会导致方法错误 MethodError: no method matching g(::Outer{Inner{Int64,Int64}}) 所以基本上,我不想说 Inner 的类型是什么,我只想让函数确保它是 Outer{Inner} 而不是 Outer{Float64} 或其他东西。

任何帮助将不胜感激

【问题讨论】:

  • 不确定,但我认为g 应该定义为function g(a::Outer{&lt;:Inner})(带有&lt;:),因为Inner{Int64,Int64} 不是Inner{Real, Real} 的子类型(请参阅位于Parametric Composite Type)
  • 谢谢!是的,这行得通,如果您遇到堆栈溢出点,只需写一个答案,我会接受!

标签: function inheritance arguments julia


【解决方案1】:

Inner{Int64,Int64} 类型是具体的Inner 类型,它不是 Inner{Real, Real},因为 Inner 的不同具体类型(Int64 或 Float64) 在内存中可以有不同的表示。

根据文档,函数g应该定义为:

function g(a::Outer{<:Inner})
    println("Naaa")
end

因此它可以接受Inner 类型的所有参数。

一些例子,在用&lt;:定义g之后:

# -- With Float32 --

julia> innerf32 = Inner(1.0f0, 1.0f0)
Inner{Float32,Float32}(1.0f0, 1.0f0)

julia> outerf32 = Outer(innerf32)
Outer{Inner{Float32,Float32}}(Inner{Float32,Float32}(1.0f0, 1.0f0))

julia> g(outerf32)
Naaa

# -- With Float64 --

julia> innerf64 = Inner(1.0, 1.0)
Inner{Float64,Float64}(1.0, 1.0)

julia> outerf64 = Outer(innerf64)
Outer{Inner{Float64,Float64}}(Inner{Float64,Float64}(1.0, 1.0))

julia> g(outerf64)
Naaa

# -- With Int64 --

julia> inneri64 = Inner(1, 1)
Inner{Int64,Int64}(1, 1)

julia> outeri64 = Outer(inneri64)
Outer{Inner{Int64,Int64}}(Inner{Int64,Int64}(1, 1))

julia> g(outeri64)
Naaa

文档中的更多详细信息:Parametric Composite Type


更新:声明不可变复合类型的方式(如在原始问题中),已更改为:

struct Inner{B<:Real, C<:Real}
    a::B
    c::C
end

struct Outer{T}
    a::T
end

此外,函数g 可以用参数类型声明:

function g(a::T) where T Outer{<:Inner}
    println(a)
    println(a.a)
    println(a.c)
end

因此,在调用函数之前无需创建Outer 的实例。

julia> ft64 = Inner(1.1, 2.2)
Inner{Float64,Float64}(1.1, 2.2)

julia> g(ft64)
Inner{Float64,Float64}(1.1, 2.2)
1.1
2.2

julia> i64 = Inner(3, 4)
Inner{Int64,Int64}(3, 4)

julia> g(i64)
Inner{Int64,Int64}(3, 4)
3
4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多