これはRuby風の方法です。
コード
def indices(str)
str.each_char.
with_index.
select { |c,_| c=='a' }.
flat_map { |_,i| (i..i+2).to_a }
end
例
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]
説明
str = "gagga"
0を仮定
次に、以下のような手順は次のとおりです
enum0 = str.each_char
#=> #<Enumerator: "gagga":each_char>
enum1 = enum0.with_index
#=> #<Enumerator: #<Enumerator: "gagga":each_char>:with_index>
は慎重に上記の戻り値を調べます。 enum1
をという化合物の列挙子と考えることができます(ただし、Rubyにはそのような概念はありません - enum1
は単に列挙子です)。私たちは、配列にenum1
を変換することによりselect
に渡されますenum1
の要素を見ることができます:
enum1.to_a
#=> [["g", 0], ["a", 1], ["g", 2], ["g", 3], ["a", 4]]
継続、
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のブロック変数がe
とi
です。 a
の最初の要素(["a", 1]
)がブロックに渡されると、ブロック変数が平行割り当て使用して割り当てられている:
e, i = ["a", 1]
#=> ["a", 1]
e #=> "a"
i #=> 1
およびブロック演算を行う。
(i..i+2).to_a
#=> (1..3).to_a
#=> [1,2,3]
注flat_map
こと
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]
最後のもの:flat_map
の最初のブロック変数e
は、ブロック計算に使用されません。このような状況では一般的に、その変数の代わりに_
(正当なローカル変数)が使用されます。これは、ブロック変数が使用されていないことを読者に知らせ、ブロック内にエラーを導入する機会を減らす可能性もあります。
関数定義を閉じるにはもう1つ '' 'end'''が必要です。 –
"私の論理がどこから落ちるか分かりますか?" - Rubyは、構文エラーであることを伝えます。コードは解析することさえできないので、明らかに実行することもできないため、ロジックが実行されることもないため、ロジックとは何の関係もない可能性があります。 –
私は昨日1時間を過ごしましたが、私が間違っていたものは得られませんでした。私はここですぐに尋ねられました。それは私が必要としていたものでした。 – hac13