gpt4 book ai didi

julia - julia 0.6 中的类型参数和内部构造函数

转载 作者:行者123 更新时间:2023-12-02 00:40:51 25 4
gpt4 key购买 nike

我对如何在 julia 0.6 中使用 where 语法限制具有抽象类型的参数类型的类型参数有疑问。

考虑一个示例,我想要创建一个采用整数的参数抽象类型,并定义从中继承的结构。如果我尝试:

abstract type AbstractFoo{T} where T<: Integer end

它失败了,但我可以使用非 where 语法

abstract type AbstractFoo{T<:Integer} end
  1. 这是推荐的格式吗?

鉴于此,我如何实现我的子类型

mutable struct Foo{T} <: AbstractFoo{T} where T <: Integer
bar::T
end

也失败(子类型无效)。我可以使用

再次绕过 where 语法
mutable struct Foo{T<:Integer} <: AbstractFoo{T}
bar::T
end

但这似乎是多余的(因为 T 已经被限制为整数)。 2.我可以省略它吗?:

mutable struct Foo{T} <: AbstractFoo{T}
bar::T
end

最后,随着内部构造函数语法的弃用,是否有任何方法可以将内部构造函数定义为:

mutable struct Foo{T} <: AbstractFoo{T}
bar::T
Foo{T}(x::T) where T = new(x)
end

这使得 Foo(3) 不可能 - 要求我使用 Foo{Int}(3)。 3. 这是故意的还是有更好的方法解决这个问题?编辑:我想对于内部构造函数问题,我总是可以定义一个外部构造函数 Foo(x::T) 其中 {T} = Foo{T}(x)

最佳答案

我会写:

abstract type AbstractFoo{T<:Integer} end

mutable struct Foo{T} <: AbstractFoo{T}
bar::T
Foo(x::T) where T = new{T}(x)
end

此 1) 将 x 限制为 Integer 2) 允许写入 Foo(2)

关于问题:

  1. 是的,这是正确且唯一正确的格式
  2. 这是有效的,T 将限制为 Integer,但您可能会收到更糟糕的错误消息,因为它是由 AbstractFoo 产生的,而不是 Foo >。您的用户可能没有注意到 FooAbstractFoo 的子类型并感到困惑。
  3. 这是引入 where 语法的主要目的之一。在新语法中,T{S} 始终指定 T 的类型参数,而 其中 S 则引入函数的类型参数。因此, Foo{T}(x) where T = 定义了 Foo{Int}(2) 应该做什么,而 Foo(x::T) where T = 定义 Foo(2) 应该做什么。引入 where 后,就不再有“内部构造函数”了。您可以在任何结构内部定义任何函数(不一定是该类型的构造函数),并在类型定义外部定义任何构造函数 - 唯一的区别是在类型定义内部,您可以访问 new

关于julia - julia 0.6 中的类型参数和内部构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44262404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com