2010-10-18 71 views
3

我想要做的事等同於Python的repr如何打印D中對象的字符串表示形式?

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

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

>>> print repr(x) 
'a\nb\nc' 

我如何能做到這一點的d?是否有類似於Python的%r的格式指令?編輯:我希望能夠打印字符串轉義形式出於調試目的(我剛剛開始學習D,我正在寫愚蠢的文本處理函數)。

回答

2

在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); 
} 
1

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 

但是,如果你有一個任意字符串而不是文字字符串l,並且希望能夠使用換行符進行打印以及將它們作爲轉義序列打印出來,則必須執行一些字符串處理 - 可能使用std.string.replace()將其每個字符替換爲其轉義序列以及額外的反斜槓。例如,爲了躲避換行,你可以這樣做:

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

但你必須這樣做單獨爲「\ T」,「\ r」,「\」,等我不知道有什麼辦法可以自動完成。所見即所得的字符串只是讓您避免在構建字符串時不得不使用所有額外的反斜槓。

1

字符串被處理並且逃逸序列在編譯時被替換。在運行時,信息丟失,您需要撤消自己逃脫(也許已經有一些標準轉義函數),但它不是內置的。

如果您控制源,則可以使用raw strings。只需在您的字符串前面輸入r即可。

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

D的標準庫不包含這樣的函數,但寫一個函數應該是微不足道的。只需通過字符串並將"\n"的每一個出現都替換爲"\\n"等等。

相關問題