Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
March 17, 2016 immutable array in constructor | ||||
---|---|---|---|---|
| ||||
In the following code, I explicitly declare array as immutable. But it compiles with the error shown below in the comment. The array object is declared immutable, so how can the compiler say it is a mutable object? In summary, how to pass an immutable array to an immutable constructor? class C { int i; this(immutable int[] array) immutable { i = array[0]; } } void func() { immutable int[] array = [1]; auto c = new C(array); // Error: immutable method C.this is not callable using a mutable object } |
March 17, 2016 Re: immutable array in constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jeff Thompson | On Thursday, 17 March 2016 at 09:57:37 UTC, Jeff Thompson wrote: > In the following code, I explicitly declare array as immutable. But it compiles with the error shown below in the comment. The array object is declared immutable, so how can the compiler say it is a mutable object? In summary, how to pass an immutable array to an immutable constructor? > > class C { > int i; > this(immutable int[] array) immutable { > i = array[0]; > } > } > > void func() { > immutable int[] array = [1]; > auto c = new C(array); // Error: immutable method C.this is not callable using a mutable object > } The error message isn't very good, but remove immutable from the constructor and it works. > this(immutable int[] array) { |
March 17, 2016 Re: immutable array in constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Anonymouse | On Thursday, 17 March 2016 at 10:04:53 UTC, Anonymouse wrote:
> On Thursday, 17 March 2016 at 09:57:37 UTC, Jeff Thompson wrote:
>> In the following code, I explicitly declare array as immutable. But it compiles with the error shown below in the comment. The array object is declared immutable, so how can the compiler say it is a mutable object? In summary, how to pass an immutable array to an immutable constructor?
>>
>> class C {
>> int i;
>> this(immutable int[] array) immutable {
>> i = array[0];
>> }
>> }
>>
>> void func() {
>> immutable int[] array = [1];
>> auto c = new C(array); // Error: immutable method C.this is not callable using a mutable object
>> }
>
> The error message isn't very good, but remove immutable from the constructor and it works.
>> this(immutable int[] array) {
This is a simplified example from a larger class I have where I need an immutable constructor. This is because I need to construct an object an pass it to other functions which take an immutable object. So, how to keep an immutable constructor?
|
March 17, 2016 Re: immutable array in constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jeff Thompson | On Thursday, 17 March 2016 at 10:11:43 UTC, Jeff Thompson wrote:
> This is a simplified example from a larger class I have where I need an immutable constructor. This is because I need to construct an object an pass it to other functions which take an immutable object. So, how to keep an immutable constructor?
The "mutable object" the compiler is complaining about is the instance of C being constructed, not the array.
Change `new C(array)` to `new immutable(C)(array)` and it should work.
|
March 17, 2016 Re: immutable array in constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jeff Thompson | On Thursday, 17 March 2016 at 10:11:43 UTC, Jeff Thompson wrote:
> This is a simplified example from a larger class I have where I need an immutable constructor. This is because I need to construct an object an pass it to other functions which take an immutable object. So, how to keep an immutable constructor?
In that case, new immutable C() should work I believe. Also, if you mark the constructor as pure, new C() should be implicitly convertible to an immutable C.
|
March 17, 2016 Re: immutable array in constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rene Zwanenburg | On Thursday, 17 March 2016 at 11:27:01 UTC, Rene Zwanenburg wrote:
> Also, if you mark the constructor as pure, new C() should be implicitly convertible to an immutable C.
Ah! That's a good tip. Now I understand why I never have to say `new immutable(C)()` in my own code. (I am in the habit of marking everything I can as `pure`.)
|
March 17, 2016 Re: immutable array in constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rene Zwanenburg | On Thursday, 17 March 2016 at 11:27:01 UTC, Rene Zwanenburg wrote:
> On Thursday, 17 March 2016 at 10:11:43 UTC, Jeff Thompson wrote:
>> This is a simplified example from a larger class I have where I need an immutable constructor. This is because I need to construct an object an pass it to other functions which take an immutable object. So, how to keep an immutable constructor?
>
> In that case, new immutable C() should work I believe. Also, if you mark the constructor as pure, new C() should be implicitly convertible to an immutable C.
new immutable C() worked! Thanks for the insight.
|
March 17, 2016 Re: immutable array in constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jeff Thompson | On 03/17/2016 09:32 AM, Jeff Thompson wrote: > On Thursday, 17 March 2016 at 11:27:01 UTC, Rene Zwanenburg wrote: >> On Thursday, 17 March 2016 at 10:11:43 UTC, Jeff Thompson wrote: >>> This is a simplified example from a larger class I have where I need >>> an immutable constructor. This is because I need to construct an >>> object an pass it to other functions which take an immutable object. >>> So, how to keep an immutable constructor? >> >> In that case, new immutable C() should work I believe. Also, if you >> mark the constructor as pure, new C() should be implicitly convertible >> to an immutable C. > > new immutable C() worked! Thanks for the insight. In case it's useful to others, I have qualified constructors covered at the following link (without the compilation error that you've faced but still pointing out the fact that the mutable constructor may be called unintentionally): http://ddili.org/ders/d.en/special_functions.html#ix_special_functions.qualifier,%20constructor Ali |
Copyright © 1999-2021 by the D Language Foundation