2016-08-03 13 views
2

Ich versuche, auf Kotlin zu kommen, so dass ich this tutorial von ihren eigenen folgen.Erwartete Int, bekam IntProgression stattdessen

sie versuchen, eine Sequenz So ein String ist, wie dies gegeben zu erstellen:

"a vect" -> [ 
    a vect : 
    a vec : t 
    a ve : ct 
    ... 
] 

Und so, wie es ist, zu tun, nach dem Video, die folgenden:

val seq = sequenceOf(canonicalisedInput.lastIndex + 1 downTo 0).map { 
    canonicalisedInput.substring(0, it) to canonicalisedInput.substring(it) 
} 

Und ich bekomme, was ich mache (naja, die Idee davon). Das Problem ist, dass substring erwartet zwei Int s, während it (die ich davon ausgehe, ist ein impliziter Iterator von einigen Arten, die von der downTo Progression kommt) ist ein IntProgression. Gleiches gilt für den zweiten Anruf substring.

Was fehlt mir?

Antwort

4

Der von Ihnen gepostete Code enthält einen Fehler: sequenceOf(...) mit einzelnem Argument übergeben gibt eine Sequenz mit dem einen Element zurück, das heißt Sequence<IntProgression>. Um eine Folge von Indizes zu erhalten (Sequence<Int>), verwenden asSequence() Funktion statt:

(canonicalisedInput.lastIndex + 1 downTo 0).asSequence().map { ... } 

Die substring(...) Funktion aufgerufen zweite the overload that returns the substring starting from the index passed as the argument ist.

Und it ist die implicit name for the innermost lambda single parameter, in Ihrem Fall ist es der Parameter map, das heißt, die Sequenz-Element von Lambda zugeordnet werden.

Also ist der Ausdruck innerhalb Lambda ein Paar (erstellt von to infix function) von zwei Teilstrings, eine vom Anfang der ursprünglichen Zeichenfolge zum Index in der Sequenz, die andere - von diesem Index bis zum Ende der Zeichenfolge.

Also sollte der Code definitiv mit Indexreihenfolge arbeiten, deshalb ist der Fehler ziemlich klar.

+0

Ich verstehe nicht, warum in meinem Fall ist es einen Fehler meldet, während in der offiziellen Tutorial es ist in Ordnung. Wie gebe ich dann einen Index an die Substring-Methode? – dabadaba

+0

@dabadaba, jetzt sehe ich, der Code, den Sie gepostet haben, enthält einen Fehler. 'sequenceOf' mit übergebenem Einzelargument gibt eine Sequenz mit diesem einen Element zurück. Um eine Folge von Indizes zu erhalten, versuchen Sie stattdessen '(canonicalisedInput.lastIndex + 1 downTo 0) .asSequence()'. – hotkey

+0

@dabadaba dieses Tutorial wurde vor der Veröffentlichung von Kotlin gefilmt. Die Funktion "sequenceOf (IntProgression)" wurde veraltet und vor der Veröffentlichung entfernt. – Ilya

3

sequenceOf(canonicalisedInput.lastIndex + 1 downTo 0) - Dieser Ausdruck erstellt eine Sequenz, die aus einem einzelnen IntProgression Element besteht.

Wenn Sie eine IntProgression einen Sequence<Int>, verwenden asSequence Erweiterungsfunktion konvertieren:

(canonicalisedInput.length downTo 0).asSequence() 
Verwandte Themen