Добавление метода преобразования в Numeric вызывает SystemStackError - PullRequest
3 голосов
/ 09 марта 2012

Я пытаюсь добавить методы преобразования в класс Numeric, но когда я запускаю следующие строки кода, я получаю SystemStackError

puts 5.dollars.in(:euros)  # => 6.5
puts 1.dollar.in(:yen)

Вот мой класс Numeric

class Numeric
  @@conversion_hash = {:dollar => {:yen => 0.013, :euros => 1.292, :rupees => 0.019}}

   def method_missing(method_id)
     name = method_id.to_s
     if name =~ /^dollar|yen|euros|rupee|$/
       self.send(name + 's')
     else
       super # pass the buck to superclass
     end
   end

   def dollars()
    puts "Called Dollars method"
    @current_currency = :dollar
    return self
   end

   def in(key)
     if @@conversion_hash.has_key?(@current_currency)
       puts "Current currency: #{@current_currency}"
       conversion_rate = @@conversion_hash[@current_currency]
       puts "Current conversion rate: #{conversion_rate}"
       if conversion_rate.has_key?(key)
         puts "we have that key"
         puts"What am I? #{self}"
         rate = conversion_rate[key]
         puts "Rate to multiply by #{rate}"
        return self.to_int * conversion_rate[key]
       end
     end
   end
 end

Любая помощь очень ценится.

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Вы получаете бесконечную рекурсию в вашем method_missing, потому что ваше регулярное выражение не совсем верно.Попробуйте изменить строку:

if name =~ /^dollar|yen|euros|rupee|$/

на:

if name =~ /^dollar|yen|euros|rupee$/

Эта дополнительная | заставляет что-либо совпадать с регулярным выражением, поэтому любой другой метод повторяется с постоянно расширяющимся суффиксомs.

В этом случае похоже, что puts, кажется, пытается вызвать to_ary, когда пытается определить тип своего аргумента.Я не совсем уверен, почему он не просто использует respond_to? - он глубоко во внутренностях Си, поэтому я не знаю, что происходит.

0 голосов
/ 10 марта 2012

Ваше решение слишком сложное. - Вам не нужно изменять method_missing. Версия Армандо работает отлично. - Вы должны простое определение доллара, чтобы хэш плюс - найти способ снова вызвать method_missing из метода in (это ваша домашняя работа). Рабочее решение имеет только 1 строку кода + 2 строки по умолчанию.

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