1

新しいマトリックス クラスを作成するように割り当てられました。require 'Matrix' を使用できません。

@matrix が配列の配列であるマトリックスの要素にアクセスするためにこれを持っています。

def [] (i, j)
  @matrix[i][j]
end

次のようにアクセスしようとすると:

@a[0][0]

それはうまくいきません。(引数の数が間違っています)

しかし、私がこのようにすると:

@a.[](0,0)

また

@a[0,0]

それはうまく動作します。それを機能させる方法についてのアイデアはありますか?

4

3 に答える 3

1
def [] (i, j)
  @matrix[i][j]
end

メソッドによると、[]2 つの引数が必要です。ただし、ここではメソッドに引数を1つだけ@a[0][0]渡しているため、そうしません。それだけ。したがって、エラーが発生しました。しかし、メソッドに2つの引数を送信しているため、完全です。と書くと、Ruby内部でメソッド呼び出しが行われます。[]0@a.[](0,0)@a[0,0][]@a[0,0]@a.[](0,0)

@a[0][0] が機能するようにコードをどのように変更しますか?

コード例を次に示します。

class Matrix
    def initialize(a)
        @matrix=a
    end
    def [](*a)
         a.size == 1 ? @matrix[*a] : @matrix[a.first][a.last]
    end
end
a = [[1,2,3],[4,7,5],[11,21,33]]
m = Matrix.new(a)
p m[2,2] # => 33
于 2013-11-06T11:26:23.970 に答える
0
def [](i)
  @matrix[i]
end

やると思います。FWIW、Rubyのマトリックスには[]が実装されており、あなたと同じように実装されています: [](i,j)

于 2013-11-06T11:39:56.370 に答える
0

自己再帰的に呼び出すか、関数に渡される引数の数をチェックするメソッドを作成する必要があります。クラス全体がいないため、これが機能するかどうかはわかりませんが、次のようなものが機能する可能性があります。

def [] (*cords)
  return @matrix[*cords] if cords.size == 1
  @matrix[cords.first][cords.last]
end

または、任意の数の次元で機能する再帰バージョン:

def [] (*cords)
   cords.inject(@matrix){|m, c| m[c]}
end
于 2013-11-06T11:36:10.343 に答える