On Wednesday, 9 October 2013 at 15:33:23 UTC, Ali Çehreli wrote:
On 10/09/2013 08:26 AM, Gary Willoughby wrote:
Can someone explain why i can change Bar's immutable name
member please?
import std.stdio;
class Foo
{
public void change(string name)
{
name = "tess";
writeln(name);
}
}
class Bar
{
private static immutable string name = "gary";
public void test()
{
auto foo = new Foo();
foo.change(this.name);
}
}
void main(string[] args)
{
auto bar = new Bar();
bar.test();
}
I thought an error would inform me that the `Foo.change`
function is
being called with the wrong parameter type.
Foo.Change receives a string:
public void change(string name)
{
name = "tess";
writeln(name);
}
That string is independent from the argument (i.e. Bar.name).
They initially share the same characters. Either of those
strings can leave this sharing at will, and that is exactly
what name="tess" does. 'name' now refers to different
immutable chars.
Ali
So why does this give me an error i expect:
import std.stdio;
class Foo
{
public void change(string[] name)
{
name[0] = "tess";
writeln(name);
}
}
class Bar
{
private static immutable string name[] = ["gary"];
public void test()
{
auto foo = new Foo();
foo.change(this.name);
}
}
void main(string[] args)
{
auto bar = new Bar();
bar.test();
}