为什么 D 中的定长 char 数组允许直接字符串赋值?
Why do fixed length char arrays in D allow direct string assignment?
D 中的字符串只是不可变的字符数组。例如。
immutable(char[]) baba = "Baba Yaga";
这样尝试
char[] baba = "Baba Yaga"; // ERROR!
会抛出异常 Error: cannot implicitly convert expression "Baba Yaga" of type string to char[]
。您需要先使用其 .dup
属性.
复制字符串
char[] baba = "Baba Yaga".dup;
但是,为什么下面的方法有效?
char[9] baba = "Baba Yaga";
你能解释一下幕后发生的事情吗?
其实很简单:编译器知道字符串文字的大小,知道静态数组的大小,可以看出它们可以简单地复制过来,所以它做到了。然后因为它知道它是一个新副本,所以不需要应用不可变,因为它只适用于对原始文件的引用。
使用 char[] baba =
,编译器不知道所有这些 - 在您的情况下,它试图将 reference 分配给原始字符串,这意味着 mutable/immutable 不匹配适用,因此它使您明确说明您想要一份副本。
D 中的字符串只是不可变的字符数组。例如。
immutable(char[]) baba = "Baba Yaga";
这样尝试
char[] baba = "Baba Yaga"; // ERROR!
会抛出异常 Error: cannot implicitly convert expression "Baba Yaga" of type string to char[]
。您需要先使用其 .dup
属性.
char[] baba = "Baba Yaga".dup;
但是,为什么下面的方法有效?
char[9] baba = "Baba Yaga";
你能解释一下幕后发生的事情吗?
其实很简单:编译器知道字符串文字的大小,知道静态数组的大小,可以看出它们可以简单地复制过来,所以它做到了。然后因为它知道它是一个新副本,所以不需要应用不可变,因为它只适用于对原始文件的引用。
使用 char[] baba =
,编译器不知道所有这些 - 在您的情况下,它试图将 reference 分配给原始字符串,这意味着 mutable/immutable 不匹配适用,因此它使您明确说明您想要一份副本。