1


1

このような配列の配列があります。

fruits_and_calories = [["" apple "、100]、[" banana "、200]、[" kumquat "、225]、[" orange "、90]]

配列の各要素に対して呼び出すメソッドもあります。

fruits_and_calories.each do | f |食べる(f [0]、f [1])

こんなことができるようになりたいです。

fruits_and_calories.each do | f |食べる(f [:name]、f [:calories])

配列内の各項目を変更せずにこれをやってのけることができる方法はありますか(たとえば、それを繰り返して記号を追加するなど)。 または、それが難しすぎる場合は、もっと良い選択肢がありますか?

5 Answer


10


最善の答えは、配列を使用することではなく、ハッシュを使用することです。

fruits_and_calories = {:apple => 100、:banana => 200、:kumquat => 225、:orange => 90} fruits_and_calories.each do |名前、カロリー|食べる(名前、カロリー)終わり


7


データ構造をまったく変更せずに、ブロック引数を変更して同じことを実現できます。

fruits_and_calories.each do |名前、カロリー|食べる(名前、カロリー)。終わり

これは、Rubyが内部配列(["apple"、100]など)をブロックの引数リスト( 'do | name、calories |)に自動的に展開するためです。 …​ end'). This is a trick that Ruby inherited from Lisp, known as '引数を破壊する'。


4


Pestoの答え(ハッシュを使う)は良い答えですが、私はStructを使うほうがいいと思います。

Fruit = Struct.new(:name, :calories)

fruits = [
  Fruit.new("apple", 100),
  Fruit.new("banana", 200),
  Fruit.new("kumquat", 225),
  Fruit.new("orange", 90)
]

fruits.each {|f| eat(f.name, f.calories)}

これはまた、名前とカロリーの両方を取ることから実例を取ることに「食べる」を変えることにも役立ちます。

fruits.each {|f| eat(f)}


0


配列は常に数字でインデックス付けされているので、私が知る限り標準配列を使うことは不可能です。

個人的には、コードの上のコメントを使用して、f [0]とf [1]が何を表しているのかを示すことを選択します。

しかし、もしあなたがそれをやろうと思っているのなら、Arrayクラスのアヒルタイプがうまくいくと思います。

クラス配列定義名。 self [0];カロリーを下げる。 self [1];終末

#それからそれを呼び出します。fruits_and_calories.each {| f |食べる(f.name、f.calories)}


0


それが配列でなければならない理由はありますか。 それはハッシュ、またはフルーツのクラスであると叫ぶようです。