2017-06-11 15 views
3

我是一个很长时间的C程序员。我听说过D并决定学习它。我喜欢它似乎提供的功能。我遇到了一个让我难倒的问题。我在网上查找并没有找到太多的答案。我想通过一个函数来传递字符串:将字符串传递给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的方式”。有人会指出我可以提供帮助吗?或者告诉我要问的问题?

如果之前已经回答过,我很抱歉。我可能没有问正确的问题。

预先感谢您的时间。

迈克尔

+0

我猜D中的字符串是按值传递的,与int和其他基本类型相同,除非另有明确规定。这意味着它们(可能还有很多其他类型)的行为与嵌入类型完全相同。相反,在C中,你根本不能“按值传递”一个数组 - 你必须坚持使用指针和“通过引用传递”。 – yeputons

+0

你应该阅读D的介绍:http://ddili.org/ders/d.en/index.html –

+0

如果你正在编写一个C程序:'void test(const char * a){a =“something” ; } int main(){const char * b =“hey”;试验(b)中; }'你会在调用测试之后期望b ==“something”吗? D(几乎)以同样的方式做它:它只是传递一个隐藏的“长度”与指针并调用一个“字符串”。 –

回答

6

添加ref为您的参数(例如,int foobar(ref string s1, ref string s2))。一个字符串只是对不可变字符的常规切片,所以它被值传递。如果你想改变切片,他们需要通过引用传递。

+0

ref是完美的答案。非常感谢你。我知道必须有办法做到这一点。 –