Right, this definition is better:
julia> type SelfRef
objs::Array{SelfRef,1}
function SelfRef()
x = new()
x.objs = [x]
return x
end
end
julia> x = SelfRef()
SelfRef([SelfRef(#= circular reference =#)])
We don't enforce that constructors actually return the appropriate type.
On Wed, Jun 18, 2014 at 4:58 PM, Luke Stagner <[email protected]> wrote:
> Thanks Stefan, although I feel like
> julia> x = SelfRef()
> 1-element Array{SelfRef,1}:
> SelfRef([SelfRef(#= circular reference =#)])
>
> Should not return an array of type SelfRef. It should return just an
> instance of itself
> As it stands, to get the behavior I want I need to call it like
> julia> x=SelfRef()[1]
> SelfRef([SelfRef(#= circular reference =#)])
>
> julia> x.objs
> 1-element Array{SelfRef,1}:
> SelfRef([SelfRef(#= circular reference =#)])
>
> julia> push!(x.objs,SelfRef()[1])
> 2-element Array{SelfRef,1}:
> SelfRef([SelfRef(#= circular reference =#),SelfRef([SelfRef(#= circular
> reference =#)])])
> SelfRef([SelfRef(#= circular reference =#)])
>
>
> On Wednesday, June 18, 2014 12:24:34 PM UTC-7, Stefan Karpinski wrote:
>
>> This works:
>>
>> julia> type SelfRef
>> objs::Array{SelfRef,1}
>> function SelfRef()
>> x = new()
>> x.objs = [x]
>> end
>> end
>>
>> julia> x = SelfRef()
>> 1-element Array{SelfRef,1}:
>> SelfRef([SelfRef(#= circular reference =#)])
>>
>>
>> A couple of points:
>>
>> The type Array{SelfRef,0} is a zero-dimensional array of SelfRef objects,
>> not a zero-length one-dimensional array of SelfRef objects. The type of a
>> one-dimensional array of SelfRef objects is Array{SelfRef,1} – aka
>> Vector{SelfRef}.
>>
>> The first argument to the Array constructor is always a type, whereas x
>> is an instance of type SelfRef. Writing [x] gives a vector of type SelfRef
>> containing just x.
>>
>>
>>
>> On Wed, Jun 18, 2014 at 4:32 AM, Luke Stagner <[email protected]> wrote:
>>
>>> Hello all,
>>>
>>> I know it is possible to have a self-referential type like the following
>>>
>>> type SelfRef
>>> obj::SelfRef
>>> SelfRef() = (x=new(); x.obj=x)
>>> end
>>>
>>> what I want to do is have obj be an array of type SelfRef so I can make
>>> a tree-like structure. I tried the following
>>>
>>> type SelfRef
>>> obj::Array{SelfRef,0}
>>> SelfRef() = (x=new(); x.obj=Array(x,0))
>>> end
>>>
>>> but that throws the following error (on nightly)
>>> julia> a=SelfRef()
>>> ERROR: no method Array{T,N}(SelfRef)
>>> in SelfRef at none:3
>>>
>>> Is there anyway I can make this work?
>>>
>>
>>