2012-12-13 19 views
6

Obecnie uczę się D i podejmuję kroki dla dzieci, więc proszę o zachowanie mnie.Kod z książki nie działa

Czytam książkę po prostu zatytułowaną "Język programowania D". Używam D-IDE do mojego kodu. Obecnie piszę program, który ma dodawać słowa do słownika (słownika), jeśli książka nie ma już tego słowa.

Problem polega jednak na tym, że kod, który podaje książka, jest nieprawidłowy, a zamiast po prostu poruszać się i czytać wyniki, które powinny być itp. Chciałem spróbować go rozwiązać. Oczywiście problem, że jestem tak nowy do D.

Kod wygląda w następujący sposób:

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 mówi Error: undefined identifier splitter i ponieważ jestem bardzo doświadczony z Java, myślę błąd oznacza, że ​​metody nie istnieje i że starała się go traktować jako zmienną, ale to też nie istnieje. Dlatego próbowałem zmienić go na "podzielony". Powoduje to kolejny błąd w słowniku: Error: associative arrays can only be assigned values with immutable keys, not char[]

Tak naprawdę nie wiem, co zrobić, aby rozwiązać ten problem i sprawić, by działało. Tak frustrujące, gdy kod z książek, które mają cię uczyć, nie działają. Używam dmd2.

+1

Na pewno ISN książka Nazywa się "Język programowania D"? Ta próbka i problemy kompilujące ją z najnowszymi narzędziami brzmią [potężnie znajome] (http://erdani.com/tdpl/errata/) ... – shambulator

+0

Tak, to jest ta książka. Nie dostałem nic z tego, kiedy dostałem książkę .. <. < – OmniOwl

+0

Niestety niektóre rzeczy uległy zmianie od czasu opublikowania, ale ta książka jest wciąż daleko i jest jednym z najlepszych dostępnych zasobów D, a także ogólnie bardzo dobra książka techniczna. – shambulator

Odpowiedz

10

Potrzebny rozdzielacz znajduje się w module std.algorithm.iteration (poprzednio std.array, ale został przeniesiony w 2016 r.). Dodaj go do swojego importu, który powinien zniknąć.

Inną rzeczą jest słownik [słowo]. Musi to być słownik [word.idup].

Powodem tego jest linia wprowadzona przez stdin.byLine w tymczasowym buforze (dla maksymalnej wydajności poprzez unikanie przydziałów pamięci). Po uzyskaniu następnego wiersza zostanie on zastąpiony poprzednim.

Nie chcesz tego w AA: klucze będą kompletnie zdezorientowane. Plik .idup tworzy kopię, która nigdy się nie zmienia.

(Powodem książka nie ma idup to prawdopodobnie dlatego, że kod jest używany do kompilacji, ale to naprawdę nie działa tak, że prawo zostało uznane za błąd.)

+0

Wydaje się to naprawić. Trochę głupie. IDE nie pokazuje tego nawet jako czegoś, co mogę wyrazić słowem za pomocą złącza kropkowego x.x Dzięki! – OmniOwl

+0

Szybkie pytanie. Zrobiłem instrukcję If, że jeśli słowo jest zakończone, a słowo już istnieje w słowniku, to zamknij program. Jak mogę jednak zakończyć program? Używanie break nie zrobiło nic. – OmniOwl

+2

Można to zrobić na dwa sposoby: najłatwiej jest po prostu wrócić; zamiast przerwy. Lub możesz złamać zewnętrzną pętlę, co oznacza umieszczenie na niej etykiety: outer_loop: foreach (line; stdin.byLine) do góry, a następnie break outer_loop; kiedy chcesz wyjść (jest to podobne do funkcji Java). –