So, does this also mean that it is not possible to have constant fields inside a composite type?
On Sun, Dec 22, 2013 at 5:26 AM, Chris Foster <[email protected]> wrote: > Or using keyword arguments: > > julia> MyType(; field1 = 1, field2 = 2, field3 = 3, field4 = 4, field5 > = 5) = MyType(field1, field2, field3, field4, field5) > MyType (constructor with 2 methods) > > julia> MyType(field4 = "asdf") > MyType(1,2,3,"asdf",5) > > You can also mix in positional arguments before the semicolon to > require a few of the fields to be specified while giving the rest of > them default values. Keyword arguments are often a good option for > functions (not just constructors) with a whole bunch of optional > arguments like this. > > > On Sun, Dec 22, 2013 at 9:10 PM, Johan Sigfrids > <[email protected]> wrote: > > Why can't you use a outer constructor to apply default values for the > type? > > > > type MyType > > field1 > > field2 > > field3 > > field4 > > field5 > > end > > > > MyType() = MyType(default1, default2, default3, default4, default5) > > > > Then you can instantiate an instance with MyType() and then just edit the > > fields you want different. > > > > m = MyType() > > m.field3 = 55 > > m.field5 = "abc" > > > > > > > > On Sunday, December 22, 2013 12:39:17 PM UTC+2, Marcus Urban wrote: > >> > >> The reason that the inner constructor is written that way is to avoid > >> having to assign values to every field when constructing a new instance. > >> Since default values are not implemented, that approach will not work. > >> > >> I am trying to avoid the situation of having a composite type with, say, > >> 20 fields, many of which have are reasonable defaults, and having to > write m > >> = myType(3, "Triangle", …, 2.5) where the ellipses represents a > sequence of > >> 17 values. (Is the 15th parameter the month of George Washington's > birth or > >> the high temperature in Alaska in 1945?) > >> > >> > >> On Saturday, December 21, 2013 9:10:36 AM UTC-6, John Myles White wrote: > >>> > >>> Assigning default values to fields of a composite type is not yet > >>> supported. > >>> > >>> Your inner constructor is also a little un-Julian, since `MyType() = > >>> new()` doesn’t assign any values to those fields. > >>> > >>> — John > >>> > >>> On Dec 21, 2013, at 4:37 AM, Marcus Urban <[email protected]> wrote: > >>> > >>> > I am a little confused about constructing composite types. Given the > >>> > definition > >>> > > >>> > type MyType > >>> > x::Int > >>> > y::Int = 6 > >>> > MyType() = new() > >>> > end > >>> > > >>> > an instance of MyType can be created using > >>> > > >>> > m = MyType() > >>> > > >>> > At that point, m.x acts as expected --- I can assign to it, read its > >>> > value, and so forth. However, attempting to access m.y produces an > error > >>> > that MyType has no field y. Based on another post, I gather that my > attempt > >>> > to provide a value to m.y in this manner is not allowed If that's > the case, > >>> > what exactly is the effect of "y::Int = 6" If this part of the code > is > >>> > completely ignored, it would be really nice if the system let me > know since > >>> > initializing fields in this way is common in many languages. > >>> > > >>> > Also, I gather that a workaround is to use a constructor that takes > >>> > named arguments. Is that still the recommended way? With just two > fields, > >>> > things are not difficult, but if the type has 20, calling a > constructor with > >>> > 20 positional arguments would be difficult. > >>> > > >>> > > >>> > > >
