【问题标题】:How can I declare the Type of a Variable in a Julia Object?如何在 Julia 对象中声明变量的类型?
【发布时间】:2017-10-30 13:56:18
【问题描述】:

如何在 Julia 中的对象的构造函数中声明一个简约类型的变量?例如,考虑以下内容:

type DetermineType
  foobar::Base.Prod2{LinSpace{Float64},LinSpace{Float64}}
end

function DetermineType(;foo = linspace(0, 1, 10),
                bar = linspace(0, 1, 10))
  foobar = Base.product(foo, bar)
  return DetermineType(foobar)
end

foobar 的声明是Base.Prod2{LinSpace{Float64},LinSpace{Float64}}。我决定使用这种类型,因为它是typeof(foobar) 的输出。虽然这个声明还不算太长,但带有两个以上 Linspace 对象的 Base.product 很快就会变得非常冗长。在浏览了 Julia 关于Types 的文档后,我想我正在寻找foobarsupertype。但是,我不知道如何获得它。有人可以帮忙吗?

【问题讨论】:

  • 为什么不直接参数化呢?
  • 在尝试为某些类型提供特定性能的版本时,限制参数类型通常很好。使用命名参数目前(0.5/0.6 版)会引入性能“挑战”,所以最好避免在热代码中使用
  • 只是快速参数化它而不受类型限制:type DetermineType{T} foobar::T end
  • @LyndonWhite 您能简要介绍一下{T} 的含义吗?我在Constructors看到过很多次,但不明白它的意思。
  • 不作为评论号。在stackoverflow上创建另一个问题,我相信你会得到一个很好的答案。 (如果尚不存在)

标签: object types julia declaration


【解决方案1】:
  1. 可以通过supertype 访问超类型。在这种情况下,supertype(typeof(foobar))Base.Iterators.AbstractProdIterator
  2. 您需要专业化的程度取决于您对功能的专业化程度。您很容易最终过度专注于类型。在这种情况下,您或许可以省略类型参数而只使用 foobar::Base.Iterators.Prod2
  3. 我不确定为什么完整类型不漂亮 - 如果您要求类型受到如此限制,它是描述类型要求的一种非常简洁的方式。

【讨论】:

  • 非常感谢您的回复!你说得对,Base.Prod2{LinSpace{Float64},LinSpace{Float64}} 不一定不漂亮。我相应地编辑了原始问题。
  • @fabian 我讨厌成为坏消息的承担者,但在 Julia 7 中,这实际上已经大大扩展了:p。 typeof(Base.product(linspace(0,1,10), linspace(0,1,10))) 现在是 Base.Iterators.Prod2{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}
  • 话虽如此,你总是可以“别名”这个并在你的类型定义中使用别名:const LinProd = Base.Iterators.Prod2{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}(唉,然而,当对象被实例化时,将显示完整类型,而不是别名)。
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 2012-09-05
  • 2020-04-19
  • 1970-01-01
  • 2023-03-20
  • 2015-04-28
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多