2009-06-09 1 views
1

아주 기본적인 금융 모듈을 Ruby에 작성하여 직접 계산을 쉽게 처리했습니다. 때로는 irb을 입력하고 함수를 호출하기가 훨씬 쉽습니다. 그러나 이상한 점은 모듈에 future_value (Finance::CompoundInterest.future_value)라는 메서드가있는 서브 모듈이 있다는 것입니다 ... 그러나 irb에 따르면 존재하지 않습니다? 그것은 아주 작지만 매번 수식을 입력하는 대신 복합 관심사를 사용할 수있는 것을 선호합니다.Ruby의 하위 모듈에 메소드를 올바르게 캡슐화하려면 어떻게해야합니까? 내 방법은 어디에도 나타나지 않을 것입니다!

irb에로드 할 때 오류나 경고가 표시되지 않으며이 방법은 모든 의도와 목적으로 보이지 않습니다. 거의 슬프게도, 나는 Finance::Mortgage을 인스턴스화 할 수 있습니다. 나는이 이상한 상황을 얻기 위해 잘못 입력 한 내용을

module Finance 
    module CompoundInterest 
    def future_value(present_value, interest, length) 
     interest /= 100 if interest >= 1 # if given in percent 1..100 
     present_value * ((1 + interest)**length) 
    end 
    end 

    class Mortgage 
    attr_accessor :amount, :rate, :years, :payment, :interest_paid 
    def initialize(amount, rate, years) 
     @amount, @rate, @years = amount, rate, years 

     i = rate/12 
     n = years * 12 
     m = (1 + i)**n 

     @payment = ((i * m)/(m - 1)) * amount 
     @interest_paid = @payment * n - amount 
    end 
    end 
end 

:

여기 내 금융 단위입니까? Ruby 1.8.7-72를 사용하고 있습니다.

답변

6

메서드 선언에서 이름 앞에 "self"를 추가해야합니다. 또는의 이름으로 모듈 즉

def self.future_value(present_value, interest, length) 

또는

def CompoundInterest.future_value(present_value, interest, length) 

예상대로 그런 다음 작동합니다. 이는 클래스에서 클래스 메소드 (인스턴스 메소드와 반대)를 정의하는 것과 같은 방법입니다.

+4

"def some_method"를 모듈에 작성하면 모듈 인스턴스 메소드가 정의됩니다.이 메소드는 "include SomeModule"을 작성할 때 인스턴스 메소드로 클래스에 복사됩니다. – Chuck

+0

오! 나는 그것을 고려하지 않았다. 포함될 때 클래스 메소드가 구현 되는가? –

+1

아니요, 모듈의 자체 메소드가 포함될 때 클래스 메소드로 혼합되지 않습니다. "포함 된"훅과 Class.extend 메소드가 무엇인지 알고 싶습니다. 더 많은 정보를 원하시는 지 물어보십시오. – mikej

관련 문제