0

配列内の各位置を評価し、特定の範囲内にある場合はその位置に新しい値を割り当てようとしています。これが私のメソッドコードとメソッド呼び出しです:

def array_eval array
    array.each do |x|
        if x.to_i <= 10
            array[x] = 1
        else
            array[x] = 2
        end
    end
end

array_eval temp_array
puts temp_array

そして、ここに端末からの私の出力エラーがあります:

carwashalgorithm.rb:109:in `[]=': no implicit conversion from nil to integer (TypeError)

from carwashalgorithm.rb:109:in `block in array_eval'
from carwashalgorithm.rb:107:in `each'
from carwashalgorithm.rb:107:in `array_eval'
from carwashalgorithm.rb:117:in `<main>'

制御フローでこれを行うことができますが、ブロックを使用してこれらすべての値を評価する簡単な方法があることを知っています。これは私が上記でやろうとしていることです。どんな助けでも大歓迎です。

4

3 に答える 3

2

ループeachは各要素に対して指定されたブロックを呼び出し、その要素を渡します。

array.each do |x| # <- x is a reference to an element
  # ...
end

Array#[]=その要素で呼び出すループ内:

  array[x] = 1    # <- the same x

これは機能しません ( が発生しTypeErrorます)。要素のindexを渡す必要があります。

使用できます-要素自体の代わりにインデックスArray#each_indexを渡します:

def array_eval(array)
  array.each_index do |x|
    if array[x].to_i <= 10
      array[x] = 1
    else
      array[x] = 2
    end
  end
end

またはArray#map!- 要素をブロックから返された値に置き換えます。

def array_eval(array)
  array.map! do |item|
    if item <= 10
      1
    else
      2
    end
  end
end

上記はワンライナーとして書くことができます(jethrooの回答を参照):

def array_eval(array)
  array.map! { |item| item <= 10 ? 1 : 2 }
end
于 2013-10-22T21:32:49.627 に答える
1

これは、Ruby では 1 行で実行できます。

array.map{|x| x.to_i <= 10 ? 1 : 2}

1.9.3-p194 :003 > a = [*0..20]
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 
1.9.3-p194 :004 > a.map{|x| x <= 10 ? 1 : 2}
=> [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] 
于 2013-10-22T20:27:22.613 に答える
1

おそらくエラーは、temp_array がインスタンス化されていないためです (コード例で temp_array の作成が表示されません)。ただし、問題が上記の @jethroo の状態のようなもので、配列に nil 値がある場合は、.to_i を評価する前に各要素に nil のチェックを追加できます。

array.map{|x| 
  if x.nil?
    puts 'element is nil, moving on...'
  else
    x.to_i <= 10 ? 1 : 2
}
于 2013-10-22T20:55:10.563 に答える