6

私は現在 D を学んでおり、赤ちゃんの一歩を踏み出しているので、ご容赦ください。

「The D Programming Language」というタイトルの本を読んでいます。コードに D-IDE を使用しています。私は現在、本に単語がまだない場合に語彙(辞書)に単語を追加するプログラムを作成しています。

ただし、問題は、本が提供するコードが無効であり、先に進んで結果がどうなるかなどを読むのではなく、試して解決したかったことです。もちろん、私がDに慣れていない問題です。

コードは次のようになります。

import std.stdio, std.string;

void main() {
    uint[string] dictionary;
    foreach(line; stdin.byLine()) {
    // Break sentence into words
    // Add each word in the sentence to the vocabulary
        foreach(word; splitter(strip(line))) {
            if(word in dictionary) continue; // Nothing to do
            auto newID = dictionary.length;
            dictionary[word] = newID;
            writeln(newID, '\t', word);
        }
    }
}

IDEによるError: undefined identifier splitterと、私はJavaの経験が豊富なので、エラーはメソッドが存在せず、そのため変数として処理しようとしたことを意味すると思いますが、それも存在しません。そこで、代わりに「分割」に変更してみました。これにより、辞書で次のような別のエラーが発生します。Error: associative arrays can only be assigned values with immutable keys, not char[]

したがって、これを解決して機能させるために何をすべきか本当にわかりません。教えてくれるはずの本からのコードが機能しないと、とてもイライラします。dmd2 を使用しています。

4

1 に答える 1

10

必要なスプリッターはstd.algorithm.iterationモジュールにあります (以前std.arrayは でしたが、2016 年に移動しました)。それをインポートに追加すると、それはなくなります。

もう一つは辞書[単語]です。代わりに、辞書 [word.idup] にする必要があります。

その理由は、stdin.byLine によって取り込まれた行が一時バッファーにあるためです (メモリ割り当てを回避して最大のパフォーマンスを得るために)。次の行を取得すると、前の行が上書きされます。

AA でそれは望ましくありません。キーがすべて混乱してしまいます。.idup は変更されないコピーを作成します。

(この本に idup がないのは、おそらくそこにあるコードがコンパイルに使用されていたためですが、実際には正しく機能しなかったため、バグと見なされたためです。)

于 2012-12-13T23:58:18.750 に答える