2016-08-31 20 views
-2

現在、私は単純な乗算方法を使っています。Rubyエラー:配列をFixnumに強制することはできません

CODE:

def multiply(*numbers) 
    product = 1 
    numbers.each{|number| 
     product *= number 
    } 
    return product 
end 

puts multiply([2, 3, 4, 5]) 

OUTPUT:乗算で

*': Array can't be coerced into Fixnum (TypeError) from calculator.rb:26:inブロック31:

「'でcalculator.rbから ':24 calculator.rbから each' from calculator.rb:24:in乗算で'

このエラーが発生します。私は配列上で ".each"を使うことができないようです。

また、配列ではなく、2つの数値を乗算する場合は、*のようにパラメータを保持します。パラメータが渡されたときにメソッドがうまく動作するようにする必要があります。つまり、配列ではなく2つの数字(つまり、乗算(2,4))です。

答えて

-1

Nevermind!* argsを使って配列を渡すとき、なり、配列の配列。

0

問題が異なっている。numbers.eachであなたはしかし、あなたが配列である一つの引数を渡しているmultiply([2, 3, 4, 5])で、引数のリストを反復処理する。引数のリストが[[2, 3, 4, 5]]です。これだけの反復であなたはやろうとしています:

1 *= [2, 3, 4, 5] 

これは基本的にRubyには意味がないので、エラーが発生します。

あなたは、引数のリストとmultiply方法、ないONA配列引数を呼び出す必要があります。そして、それは動作します

乗算(2、3、4、5)

を。

1

multiplyは、任意の数のパラメータが必要です。パラメータは1つだけ渡します。これは配列です。最初の反復では、numberが配列全体です。したがって、エラーメッセージ。

あなたが呼び出しを修正する必要があり、どちらか

multiply(*[2, 3, 4, 5]) 

や、シンプルな、

multiply(2, 3, 4, 5) 
0

あなたが入力として配列を使用することができるようにしたい場合は、上のflatten方法に使用することができます配列numbers

def multiply(*numbers) 
    product = 1 
    numbers.flatten.each{|number| 
     product *= number 
    } 
    return product 
end 

puts multiply([2, 3, 4, 5]) #=> 120 

flattenメソッドは2次元配列を取り、単純な配列になります。

これはまた、あなたがフラット化方式を適用した後、あなたは

[2, 3, 4, 5, 2, 2] 

を取得後、各数を乗算し始めることができ、この場合

numbers = [[2, 3, 4, 5], 2, 2] 

multiply([2, 3, 4, 5], 2, 2) #=> 480 

に動作します。

Rubyでは通常通り、あなたが探していることを行う方法が通常あります。この場合、injectreduceは、あなたが探しているものを達成することができます。

def multiply(*numbers) 
    numbers.flatten.reduce(&:*) 
end 
関連する問題