Or an immutable type.
> On Dec 22, 2013, at 5:18 PM, James Porter <[email protected]> wrote: > > If you want a constant field its probable that you would be better served by > type parameter. > >> On Sunday, December 22, 2013 3:14:15 PM UTC-6, Marcus Urban wrote: >> 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. >>> >>> > >>> >>> > >>> >>> >>> > >>
