Object 如何在Julia对象中声明变量的类型?

Object 如何在Julia对象中声明变量的类型?,object,types,julia,declaration,Object,Types,Julia,Declaration,如何在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)

如何在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关于的文档之后,我想我正在寻找
foobar
supertype
。然而,我不知道如何获得它。有人能帮忙吗

  • 可以通过
    Supertype
    访问Supertype。在本例中,
    supertype(typeof(foobar))
    是一个
    Base.Iterators.AbstractProdIterator
  • 您需要专门化的程度取决于您需要功能的专门化程度。你很容易就把这个类型专门化太多了。在这种情况下,您可能可以省略类型参数,只使用
    foobar::Base.Iterators.Prod2
  • 我不确定为什么完整类型不美观——如果您需要对类型进行如此严格的限制,那么它是描述类型需求的一种非常简洁的方式

  • 为什么不在没有限制的情况下对其进行参数化呢?当试图为某些类型提供特定的性能版本时,限制参数类型通常是很好的。使用命名参数目前(0.5/0.6版)可能会带来性能“挑战”,因此最好避免在热代码中使用。只需在类型中快速地对其进行参数化而不受限制,就可以编写:
    type DetermineType{T}foobar::T end
    @lyndoweight您能简要介绍一下
    {T}
    的含义吗?我在中多次看到它,但不理解它的含义。不是作为评论编号。创建另一个关于stackoverflow的问题,我相信你会得到一个好的答案。(如果还没有)非常感谢您的回复!你是对的,
    Base.Prod2{LinSpace{Float64},LinSpace{Float64}
    不一定很漂亮。我相应地编辑了原始问题。@fabian我不想成为坏消息的传递者,但在《朱莉娅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}
    (遗憾的是,当对象实例化时,将显示完整的类型,而不是别名).