我可以在外部构造函数中为参数类型构建无参数构造函数吗?

时间:2015-11-06 15:56:03

标签: julia

为了实例化类似x = MyType{Int}()

的类型

我可以定义一个内部构造函数。

immutable MyType{T}
    x::Vector{T}

    MyType() = new(T[])
end

是否可以使用外部构造函数实现相同的目标?

3 个答案:

答案 0 :(得分:1)

可以使用以下语法完成此操作:

(::Type{MyType{T}}){T}() = MyType{T}(T[])

第一组括号中的内容描述了被调用对象。 ::T表示"类型为T",因此这是调用Type{MyType{T}}类型对象的定义,这意味着对象MyType{T}本身。下一个{T}表示T是此定义的参数,并且必须有一个值才能调用此定义。因此MyType{Int}匹配,但MyType不匹配。从那以后,语法应该是熟悉的。

这种语法肯定有点繁琐且不直观,我们希望在未来的语言版本中改进它,希望v0.6。

答案 1 :(得分:0)

我可能错了,但是如果你不能像这样构建无参数函数:

julia> immutable MyType{T}
           x::Vector{T} 
       end

julia> MyType{T}() = MyType{T}(T[])
WARNING: static parameter T does not occur in signature for call at none:1.
The method will not be callable.
MyType{T}

julia> x = MyType{Int}()
ERROR: MethodError: `convert` has no method matching convert(::Type{MyType{Int64}})
...

因此你将无法做到这一点:

.model small 
.stack 100h
.data
        msg1 db 'Enter the number1:$'
        msg2 db 'Enter the number2:$'
        msg3 db 'After swap numbers are:$'
        msg4 db 'Sum is:$'
        num1 db ?
        num2 db ?
        sum db ?
        diff db ?
.code
MAIN PROC
        mov ax,@data
        mov ds,ax

        mov ah,09h         ;display first msg
        mov dx,offset msg1
        mov ah,01h         ;taking input
        int 21h
        mov num1,al


        mov ah,09h         ;display second msg
        mov dx,offset msg2
        int 21h
        mov ah,01h         ;taking input
        int 21h
        mov num2,al

        mov bl,num1
        mov cl,num2
        mov num1,cl
        mov num2,bl

        mov ah,09h         ;display third msg
        mov dx,offset msg3
        int 21h
        mov ah,02h
        mov dl,num1
        int 21h
        mov ah,02h
        mov dl,num2
        int 21h

        mov bl,num1
        add bl,num2
        mov sum,bl

        mov ah,09h       ;display fourth msg
        mov dx,offset msg4
        int 21h
        mov ah,02h
        mov dl,sum
        int 21h

        mov ah,4ch
        int 21h
MAIN ENDP 

END MAIN

每个外部构造函数也是一个函数。

答案 2 :(得分:0)

你可以说

f(T::Type) = show(T)

以及

MyType(T::Type) = MyType(T[])

但是朱莉娅需要在电话中看到你知道你想要的类型。