54547


一つの文字列を因数として取り、文字列が大文字だった場合は、そのindex番号を配列に返すというメソッドを作成してくださいという、コードチャレンジです。  
このケースで存在しない配列の6番目を返したり、期待通りのメソッドになりません。

[code]

    def capital_index("rABbiT")
    #your code
    end
    
[/code]

[code]

    capital_index("rABbiT") -> [1, 2, 5]
    
[/code]

**My code**

[code]

    def capital_index(string)
      arr = []
      i = 0
        while i <= string.length
          if string[i] == string.upcase[i]
            arr.push(i)
            p arr
          end
          i += 1
        end
    
    end
    capital_index("rABbiT")
    
[/code]

[code]

    [1]
    [1, 2]
    [1, 2, 5]
    [1, 2, 5, 6]
    
[/code]


CC BY-SA 4.0
2019-04-28T11:00:06.507
54545
2019-04-29T08:05:10.173
22895
question
ruby
Ruby コードチャレンジ


一番まずいのはここですね。

[code]

    while i <= string.length
    
[/code]

Rubyの文字列のインデックスは0から始まるんで、6文字の文字列なら最大で5まで、つまり

[code]

    while i < string.length
    
[/code]

としないといけません。

また、メソッドからの戻り値として配列を戻さないといけないようなので、それも追加しないといけないですね。

と言うわけで全体はこんな感じ。

[code]

    def capital_index(string)
      arr = []
      i = 0
      while i < string.length #(1)
        if string[i] == string.upcase[i]
          arr.push(i)
          #p arr
        end
        i += 1
      end
      arr #(2)
    end
    
[/code]

これで「存在しない配列の6番目を返し」は、なくなるはずです。そのあとの「たり」が何なのかがちょっと気になるんですが。

* * *

あるいは、`while`の代わりに`for`を使うこともできるでしょう。

[code]

    def capital_index(string)
      arr = []
      for i in 0...string.length
        if string[i] == string[i].upcase
          arr.push(i)
        end
      end
      arr
    end
    
[/code]

* * *

こんな書き方もできます。

[code]

    def capital_index(string)
      string.chars.map.with_index {|ch,ix| [ch,ix]}
        .select{|pair| pair[0] == pair[0].upcase}
        .map{|pair| pair[1]}
    end
    
[/code]

他にももっとうまいやり方があるかもしれません。とりあえず最初の修正だけで目的の動作をするはずだと思うんですが、何かありましたらお知らせください。


CC BY-SA 4.0
2019-04-28T11:59:55.363
54547
2019-04-28T11:59:55.363
13972
54545
answer


こういうのはどうでしょうか？

[code]

    def capital_index(str)
      (0...str.length).select {|i| str[i] == str[i].upcase }
    end
    
    capital_index('rABbiT') #=> [1, 2, 5]
    
[/code]


CC BY-SA 4.0
2019-04-29T08:05:10.173
54562
2019-04-29T08:05:10.173
9608
54545
answer