如何使type属性成为其他类型属性的函数?

时间:2014-03-04 00:53:59

标签: julia

要声明新的复合类型,我们使用以下语法

type foo
    a::Int64
    b::Int64
end

并像这样实例化

x = foo(1,3)

有没有办法让类型属性始终只是其他属性的函数?例如,是否有某种方法可以执行以下操作(这是无效的语法)...

type foo
    a::Int64
    b::Int64
    c = a + b
end

我目前的解决方法是定义一个计算c并返回该类型实例的函数,就像这样......

type foo
    a::Int64
    b::Int64
    c::Int64
end

function foo_maker(a, b)
    return foo(a, b, a+b)
end

有更优雅的解决方案吗?可能包含在类型定义中的那个?

编辑 - 3/7/14

考虑到Cristóvão的建议,我最终声明了以下构造函数,以允许在实例化时计算关键字args和属性

# Type with optional keyword argument structure
type LargeType

    # Declare all the attributes in order up top
    q::Int64
    w::Int64
    e::Int64
    r::Int64
    t::Int64
    y::Int64
    a::Number
    b::Number
    c::Number

    # Declare Longer constructor with stuff going on in the body
    LargeType(;q=1,w=1,e=1,r=1,t=1,y=1) = begin 
        # Large Constructor Example 
        a = round(r^t - log(pi))
        b = a % t
        c = a*b
        # Return new instance with correctly ordered arguments
        return new(q,w,e,r,t,y,a,b,c)
    end

end


println(LargeType(r=2,t=5))

2 个答案:

答案 0 :(得分:3)

试试这个:

julia> type foo
           a::Int64
           b::Int64
           c::Int64
           foo(a::Int64, b::Int64) = new(a, b, a+b)
       end

julia> foo(1,2)
foo(1,2,3)

julia> foo(4,5,6)
no method foo(Int64, Int64, Int64)

但是,这不会阻止人们手动更改a,b或c并使c不一致。为了防止这种情况,如果它没有出现其他问题,你可以使foo不可变:

julia> immutable foo
           ...

答案 1 :(得分:0)

目前没有任何办法可以做到这一点,但未来可能会有:

https://github.com/JuliaLang/julia/issues/1974