传递给函数的字符串在D语言中未被其更改

传递给函数的字符串在D语言中未被其更改,d,D,我是一个长期的C程序员。我听说了D,并决定学习它。我喜欢它提供的功能。我遇到了一个让我困惑的问题。我在网上查过,没有找到多少答案。我试图通过函数传递字符串: module main; import std.stdio; import std.string; int foobar(string s1, string s2) { string t1="Hello"; string t2="there"; writeln("t1 = ",t1, " t2 = ", t2);

我是一个长期的C程序员。我听说了D,并决定学习它。我喜欢它提供的功能。我遇到了一个让我困惑的问题。我在网上查过,没有找到多少答案。我试图通过函数传递字符串:

module main;

import std.stdio;
import std.string;

int foobar(string s1, string s2)
{
    string t1="Hello";
    string t2="there";
    writeln("t1 = ",t1, " t2 = ", t2);
    s1=t1;
    s2=t2;
   writeln("s1 = ",s1," s2 = ",s2);
   return 0;
}

int main(string[] args)
{
    string a1;
    string a2;
    foobar(a1, a2);
    writeln("a1 = ",a1," a2 = ",a2);
    return 0;
}
输出如下:

t1 = Hello t2 = there
s1 = Hello s2 = there
a1 =  a2 = 
我试图在网上搜索答案,但我找不到答案。我怀疑我问的问题不对。我知道我可以使用char字符串来实现这一点,但我正在尝试使用“D方式”。有人能给我指一个能帮我做这件事的推荐人,或者告诉我要问的问题吗

如果之前有人回答过,我道歉。我可能没有问正确的问题

提前感谢您抽出时间


Michael

ref
添加到您的参数中(例如,
intfoobar(ref string s1,ref string s2)
)。字符串只是不可变字符的常规切片,所以它通过值传递。如果要更改切片,则需要通过引用传递它们。

我猜D中的字符串是通过值传递的,与
int
s和其他基本类型相同,除非另有明确指定。这意味着它们(可能还有许多其他类型)的行为与嵌入式类型完全相同。相反,在C语言中,你不能“按值传递”数组——你必须坚持使用指针和“按引用传递”。你应该阅读D的介绍:如果你在编写C程序:
void test(const char*a){a=“something”;}int main(){const char*b=“嘿;test(b);}
你希望b==“something”吗呼叫测试后?D的方法(几乎)相同:它只是用指针传递一个隐藏的
长度
,并调用
字符串
。ref是完美的答案。非常感谢你。我知道一定有办法做到这一点。