Как правильно инкапсулировать методы в подмодулях в Ruby? Мои методы нигде не появятся! - PullRequest
1 голос
/ 09 июня 2009

Я написал очень простой модуль finance в Ruby, чтобы упростить мои собственные вычисления, поскольку иногда просто ввести irb и начать вызывать функции намного проще. Но странным является то, что в моем модуле есть подмодуль с методом с именем future_value (Finance::CompoundInterest.future_value) ... но, согласно irb, его не существует? Он довольно маленький, но я бы предпочел использовать сложный процент вместо того, чтобы вводить формулу каждый раз.

При загрузке в 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.

1 Ответ

6 голосов
/ 09 июня 2009

В объявлении метода вам нужно добавить префикс к имени "self". или с именем модуля, т.е.

def self.future_value(present_value, interest, length)

или

def CompoundInterest.future_value(present_value, interest, length)

Затем он должен работать так, как вы ожидаете. Это то же самое, что вы определяете метод класса (в отличие от метода экземпляра) в классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...