2016-04-20 12 views
0

目的は、文字 'a'が文字列内にあるかどうかを調べ、文字列内の 'a'文字列内の文字を見つけて位置を取得する - ruby​​

ので、文字列は「ゲイブ」だった場合、私のリストは、このリスト= [2,3,4]のようになります。 string 'はガバ' をリスト= [2,3,4,5,6,7]

私の現在のコードは、私が最後

def nearby_az(string) 
list = [] 
for i in 0..(string.length) 
    if string[i] == 'a' 
     list.push(i+1) 
     list.push(i+2) 
     list.push(i+3) 
     next 
    end 
return list 

私にエラーを与えているように見える場合には次のエラーが表示されます。 (repl):11:構文エラー、予期しない入力の終了、expecting keyword_end

私の論理がどこから落ちるか分かりますか?

+1

関数定義を閉じるにはもう1つ '' 'end'''が必要です。 –

+1

"私の論理がどこから落ちるか分かりますか?" - Rubyは、構文エラーであることを伝えます。コードは解析することさえできないので、明らかに実行することもできないため、ロジックが実行されることもないため、ロジックとは何の関係もない可能性があります。 –

+1

私は昨日1時間を過ごしましたが、私が間違っていたものは得られませんでした。私はここですぐに尋ねられました。それは私が必要としていたものでした。 – hac13

答えて

1

エンドで範囲ブロックを閉じていないという事実に起因するエラーです。しかし、それ以外の点もあります。 (この方法で、あなたもNSTRの自然なインデックスを使用することにより、人工的なインデックスを作成する必要はありません

def nearby_az(str) 
    list = Array.new 
    pos = -1 
    str.each_char do |c| 
    pos = pos + 1 
    if (c == 'a') then 
     list.push(pos+1) 
     list.push(pos+2) 
     list.push(pos+3) 
    end 
    end 
    list 
end 

か、まだ良く

def nearby_az(str) 
    list = Array.new 
    nstr = str.each_char.to_a 
    nstr.each_index do |i| 
    if (nstr[i] == 'a') then 
     list.push(i+1) 
     list.push(i+2) 
     list.push(i+3) 
    end 
    end 
    list 
end 

:私はあなたがこのような何かを試してみることをお勧めあなたがしなければ配列)このコードで

puts nearby_az("asdfgaqwer") 

結果は[1,2,3,6,7,8]になります。

あなたはRubyでリターンは必要ありません覚えておいてください。メソッドで計算された最後の式の値は、デフォルトでメソッド呼び出し元に返されます。

はもちろん、あなたがこれをやって、あなたの方法を使用し続けることがあります。

def nearby_az(string) 
    list = [] 
    for i in 0..(string.length) 
    if string[i] == 'a' 
     list.push(i+1) 
     list.push(i+2) 
     list.push(i+3) 
    end 
    end 
    list 
end 

そして、私は最初のコードが読み少し簡単だと思うが、それは、あなたにも同じ結果が得られます。

1

これは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のブロック変数がeiです。 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は、ブロック計算に使用されません。このような状況では一般的に、その変数の代わりに_(正当なローカル変数)が使用されます。これは、ブロック変数が使用されていないことを読者に知らせ、ブロック内にエラーを導入する機会を減らす可能性もあります。

+0

優れた答え!私はOPが私の代わりにあなたの答えを受け入れることを提案する!もっとRubyを学ぶ機会に感謝します。 –

+1

ありがとう、@ EdedeAlmeida、しかし、OPは彼または彼女に最も役立つ答えを選択することをお勧めします忘れないでください。あなたはOPのコードで問題を説明しましたが、私はそうしませんでした。そして時にはよく知られたアプローチの改善は、問題に対処する全く異なる方法よりも高く評価されます。私の答えはOP以外の読者にも多かった。 –

+0

最後に、OPは全く答えを選びませんでした... LOL –

関連する問題