5

set_elementMatrixクラスのインスタンスを呼び出すと、次のエラーが発生します

NoMethodError: private method ‘set_element’ called for Matrix[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]:Matrix

ただしset_element、ドキュメントのパブリックインスタンスメソッドの下にリストされています

Matrix#set_element

また、set_elementは[] =(i、j、v)のエイリアスであり、このメソッドを使用すると次のエラーが発生します

ArgumentError: wrong number of arguments (3 for 2)

意味がありません、助けていただければ幸いです。

Ruby 1.9.2 p180

4

2 に答える 2

7

おそらくあなた自身のクラス(またはMatrix自体)で、setter関数をパブリックにすることができます:

class SetableMatrix < Matrix
  public :"[]=", :set_element, :set_component
end
于 2012-01-24T15:19:01.613 に答える
1

ドキュメントが正しくありません。1.9.1のファイルを見ると、次のmatrix.rbことがわかります。

def []=(i, j, v)
  @rows[i][j] = v
end
alias set_element []=
alias set_component []=
private :[]=, :set_element, :set_component

したがって、3つのメソッドがありますが、それらは明示的にプライベートとして設定されています。

少し簡単に実験すると、ドキュメント内の多くのメソッドが実際にはプライベートであることがわかります。マニュアルページの上部には、明らかに利用可能なメソッドと思われるものをリストしたドキュメントの大きなブロックがあります。そのリストはrdocが生成したリストと一致しないため、混乱が生じます。

Matrixのインスタンスは、FixnumやNumberと同じように不変であることが意図されているという印象を受けます。

于 2011-06-24T05:43:50.820 に答える