1

ルビーに問題がある

これが私がやろうとしていることです

def iterate1               #define method in given class
 @var3 = @var2.split(" ")  #split string to array
 @var4 = @var3

 @var4.each do |i|         #for each array item do i
   ra = []
   i.each_char {|d|  ra << counter1(d)}  # for each char in i, apply def counter1

   @sum = ra.inject(:+)                  

   @sum2 = @sum.inject(:+)               #have to do the inject twice to get values

 end

@sum2

私はこれを複雑にしすぎていることを知っています

基本的に、入力は「14556 この単語 398」のような文字と値の文字列です。

(" ") のような空白で区切られた各値の数値を合計しようとしています。

def iterate1 メソッドを使用すると、ブロックは counter1 メソッドを正常に呼び出しますが、文字列の最後の単語または値の値しか取得できません。

この場合は 398 で、合計すると 27 になります。

ブレークを含めると、最初の値である 21 が得られます。

すべての合計値を含む配列を出力しようとしています

どんな助けでも大歓迎です

4

2 に答える 2

2

私はあなたが後だと思います:

"10 d 20 c".scan(/\b\d+\b/).map(&:to_i).inject(:+) # Returns 30

scan(/\b\d+\b/)配列内の数字のみで構成されているすべての数値を抽出し、map(&:to_i)それらを整数に変換します。何inject(:+)が行われるかは既にわかっていると思います。

ただし、あなたが何を求めているのかを正しく理解しているかどうかはわかりません。そのため、この入力に対して期待する答えを提供していただけると助かります。

編集:

各数値の桁を合計したい場合は、次のように実行できます。

"12 d 34 c".scan(/\b\d+\b/).map { |x| x.chars.map(&:to_i).inject(:+) }

x.chars数字の列挙子を返し、map(&:to_i)整数に変換してinject(:+)合計します。

于 2012-07-23T12:52:01.253 に答える
0

最も簡単な答えは、前者が結果を収集して配列を返すため、map代わりに使用することです。each例えば:

def iterate1               #define method in given class
 @var3 = @var2.split(" ")  #split string to array
 @var4 = @var3

 @var4.map do |i|         #for each array item do i
   ra = []
   i.each_char {|d|  ra << counter1(d)}  # for each char in i, apply def counter1

   @sum = ra.inject(:+)                  
   @sum2 = @sum.inject(:+)               #have to do the inject twice to get values
 end
end

あなたはそれをもっときれいに書くことができましたが、ステファンは大きな助けになったと思います. 彼のコードを少し変更するだけで問題を解決できます

# when you call iterate, you should pass in the value
# even if you have an instance variable available (e.g. @var2)
def iterate(thing)
  thing.scan(/\b\d+\b/).map do |x| 
    x.chars.map{|d| counter1(d)}.inject(:+)
  end
end

上記は、counter1メソッドが値を整数として返すことを前提としています

于 2012-07-24T05:01:54.503 に答える