如何打印字符串';对象在D中的s表示?

如何打印字符串';对象在D中的s表示?,d,D,我想做一些类似于Python的repr: >>> x = "a\nb\nc" >>> print x a b c >>> repr(x) "'a\\nb\\nc'" >>> print repr(x) 'a\nb\nc' 我怎样才能在D中做到这一点?是否有类似于Python的%r的格式指令 编辑:我希望能够以转义形式打印字符串以进行调试(我刚刚开始学习D,我正在编写愚蠢的文本处理函数)。在D中,字符串不是对象,当使用转

我想做一些类似于Python的
repr

>>> x = "a\nb\nc"

>>> print x
a
b
c
>>> repr(x)
"'a\\nb\\nc'"

>>> print repr(x)
'a\nb\nc'
我怎样才能在D中做到这一点?是否有类似于Python的
%r
的格式指令


编辑:我希望能够以转义形式打印字符串以进行调试(我刚刚开始学习D,我正在编写愚蠢的文本处理函数)。

在D中,字符串不是对象,当使用转义字符时,实际上是存储字符,而不是转义本身(我希望Python也会这样做). 因此,如果您想将字符串转换为转义形式,您需要自己修改输出(我不知道有任何库函数用于此)

否则,对象可以重写toString()函数,该函数将生成对象的字符串表示形式

更新:这里是D中repr的一个示例。但是请注意,由于原始文本没有存储在可执行文件中的任何位置,因此它也将转换文本表示。Unicode不应该有问题,因为字符串的正常完整性是完整的

import std.stdio;
import std.exception;

void main() {
    writeln(repr("This\nis\n\t*My\v Test"));
}

string repr(string s) {
    char[] p;
    for (size_t i; i < s.length; i++)
    {
        switch(s[i]) {
            case '\'':
            case '\"':
            case '\?':
            case '\\':
                p ~= "\\";
                p ~= s[i];
                break;
            case '\a':
                p ~= "\\a";
                break;
            case '\b':
                p ~= "\\b";
                break;
            case '\f':
                p ~= "\\f";
                break;
            case '\n':
                p ~= "\\n";
                break;
            case '\r':
                p ~= "\\r";
                break;
            case '\t':
                p ~= "\\t";
                break;
            case '\v':
                p ~= "\\v";
                break;
            default:
                p ~= s[i];
                break;
        }
    }

    return assumeUnique(p);
}
导入标准stdio;
进口标准例外;
void main(){
writeln(repr(“此\n\n\t*My\v测试”);
}
字符串报告(字符串s){
char[]p;
用于(尺寸i;i
D有两种方法来声明所见即所得字符串:

r"thestring"
`thestring`
那么下面的节目呢,

import std.stdio;

void main()
{
    auto a = r"hello\nworld";
    auto b = `hello\nworld`;

    writeln(a);
    writeln(b);
}
印刷品

hello\nworld
hello\nworld
但是,如果您有一个任意字符串,而不是字符串文字,并且您希望能够使用换行符和不作为转义序列打印的内容来打印它,那么您必须执行一些字符串处理—可能使用
std.string.replace()
用额外的反斜杠替换每个字符的转义序列。例如,要转义换行符,请执行以下操作:

str.replace("\n", "\\n");

但是你必须为'\t'、'\r'、'\'等单独执行此操作。我不知道自动执行此操作的任何方法。WYSIWYG字符串只是让你避免在构造字符串时使用所有额外的反斜杠。

字符串将在编译时被处理,转义序列将被替换。在运行时,信息将丢失,并且您需要自己撤销转义(可能已经有一些标准转义函数),但它不是内置的

如果您控制了可以使用的源代码,只需在字符串前面加一个
r

"a\tb" => "a    b"
r"a\tb" => "a\tb"

D的标准库不包含这样的函数,但编写这样的函数应该很简单。只需遍历字符串并将出现的
“\n”
替换为
“\\n”
,依此类推