2011-03-21 5 views
1

Matrix 클래스를 만들고 코드의 여러 부분에서 사용하고 싶습니다.Ruby Class # new - 왜`new`가 private 메소드입니까?

class Matrix 
    def initialize(x, y, v=0) 
    @matrix = Array.new 
    (0..y).each do |j| 
     @matrix[j] = Array.new 
     (0..x).each do |i| 
     @matrix[j][i] = v 
     end 
    end 
    end 
end 

이 코드가이 코드를 사용하는 코드와 동일한 클래스에 포함되어 있으면 모든 것이 정상적으로 실행됩니다. 내가 lib/matrix.rb에이 코드를 이동하고 필요할 때

, 나는 다음과 같은 오류가 발생합니다 :

그것은 Matrix is a class from the standard ruby library 때문에, 클래스 다른 이름을 부여 시도하거나 모듈 내부에 넣어의
./phylograph:30:in `block in run': private method `new' called for Matrix:Class (NoMethodError) 
+0

마지막'matrix.rb' 파일을 볼 수 있습니까? 이 특정 코드 블록에 관한 것은 그 종류의 효과가있는 것처럼 보입니다. – Matchu

답변

5

내가 기억 하듯이 Matrix은 순전히 functional 클래스입니다. 그것의 객체는 불변이며, 새로운 Matrix 객체를 생성하는 것은 API가 변경 가능한 연산을 가지지 않기 때문에 일반적으로 쓸모가 없다.

그래서 새 Matrix 개체는 사용자 수준에서 new을 사용하지 않는 API로 만들어집니다.

작성자의 디자인 결정입니다.

업데이트 : OIC, 표준 라이브러리 Matrix 클래스를 사용할 의사가 없습니다. 그래서 내가 그냥 말을 위해 위의 기술적 문제에 대한 이유이지만 더 도움이되었을 것이다 : 관해서

Your definition of Matrix is clashing with the Ruby Standard Library class of the same name.

+0

D' oh! 그리고 수업을 여는 Ruby의 기능을 즐기기 시작했을 때, 저를 물었습니다. –

+4

그래서 스스로에게 물어야합니다. "매트릭스 란 무엇입니까?" –

1

이유는 단지 비트 버그 당신 당신은 lib/matrix.rb로 이동할 때 전에

당신은 그것을 옮기고, 코드에 require 'matrix'을 가지지 않았기 때문에 매트릭스 표준 라이브러리를로드하지 않았습니다. 하지만 코드를 옮기고 코드에 require 'matrix'을 추가하면 행렬 표준 라이브러리가로드됩니다.

이 때문에 라이브러리를 작성할 때 only make one file visible to other code이라고 알려줍니다. matrix 라이브러리의 다른 파일을 다른 코드에서 볼 수 있다면 문제가 얼마나 심각 할 지 상상해보십시오!