Hier ist eine Ruby-ähnliche Weise, die Sie tun könnten.
-Code
def indices(str)
str.each_char.
with_index.
select { |c,_| c=='a' }.
flat_map { |_,i| (i..i+2).to_a }
end
Beispiele
indices "gabe"
#=> [1, 2, 3]
indices "gabba"
#=> [1, 2, 3, 4, 5, 6]
indices "abbadabbadoo"
#=> [0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10]
Erklärung
Angenommen
str = "gagga"
Dann sind die Schritte wie folgt:
enum0 = str.each_char
#=> #<Enumerator: "gagga":each_char>
enum1 = enum0.with_index
#=> #<Enumerator: #<Enumerator: "gagga":each_char>:with_index>
vorsichtig den oben Rückgabewert prüfen. Sie können sich enum1
als Compound Enumerator vorstellen (obwohl Ruby kein solches Konzept hat - enum1
ist einfach ein Enumerator). Wir können die Elemente von enum1
sehen, die von enum1
auf ein Array Umwandlung zu select
weitergegeben wird:
enum1.to_a
#=> [["g", 0], ["a", 1], ["g", 2], ["g", 3], ["a", 4]]
Continuing,
a = enum1.select { |c,_| c=='a' }
#=> [["a", 1], ["a", 4]]
a.flat_map { |e,i| (i..i+2).to_a }
#=> [1, 2, 3, 4, 5, 6]
Enumerable#flat_map ‚s Blockvariablen sind e
und i
.
e, i = ["a", 1]
#=> ["a", 1]
e #=> "a"
i #=> 1
und den Block Berechnung wird durchgeführt:: wenn das erste Element des a
(["a", 1]
) an den Block übergeben wird, werden die Blockvariablen parallel Zuordnung Verwendung zugewiesen
(i..i+2).to_a
#=> (1..3).to_a
#=> [1,2,3]
anzumerken, dass flat_map
entspricht:
b = a.map { |e,i| (i..i+2).to_a }
#=> [[1, 2, 3], [4, 5, 6]]
c = b.flatten(1)
#=> [1, 2, 3, 4, 5, 6]
Eine letzte Sache: flat_map
's erste Blockvariable, e
, wird nicht in der Blockberechnung verwendet. Wie in solchen Situationen üblich, wird stattdessen _
(eine zulässige lokale Variable) für diese Variable verwendet. Dies informiert den Leser, dass diese Blockvariable nicht verwendet wird, und kann auch die Wahrscheinlichkeit verringern, Fehler innerhalb des Blocks einzuführen.
Sie benötigen noch ein '' 'Ende''', um die Funktionsdefinition zu schließen. –
"Kannst du sehen, wo meine Logik abfällt?" - Ruby sagt dir, dass es ein * Syntax * -Fehler ist. Da der Code nicht einmal geparst werden kann, kann er offensichtlich auch nicht ausgeführt werden, und somit kann dies unmöglich etwas mit Ihrer Logik zu tun haben, da Ihre Logik niemals ausgeführt wird. –
Ich habe gestern eine Stunde verbracht, aber nicht verstanden, was ich falsch mache. Gut, dass ich eher früher als später gefragt habe. Das war alles was ich brauchte - und extra 'Ende'! – hac13