Ruby DSL Инициализация переменных - PullRequest
0 голосов
/ 29 февраля 2012

Я пытаюсь повторить функциональность Синатры. В частности, DSL-подобная часть, где вы можете определить маршруты в определении класса. Когда я пытаюсь запустить свою версию person-DSL, я получаю сообщение об ошибке undefined method '<<' for nil:NilClass в строке 11.

class Persons
  class << self
    def reset!
      @persons = []
    end

    def add_person title, name
      @persons << {
        title: title,
        name: name
      }
    end
  end

  reset!
end

class MyPersons < Persons
  add_person 'Dr.', 'Bob'
  add_person 'Mr.', 'Jones'
end

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Вы никогда не инициализируете @persons чем-либо, кроме nil.Простое исправление:

class MyPersons < Persons
  reset!
  add_person 'Dr.', 'Bob'
  add_person 'Mr.', 'Jones'
end

Причина, по которой ваш вызов reset! не работает, заключается в том, что MyPersons и Persons не используют одну и ту же переменную @persons.

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

class Persons
  @@persons = []
  class << self
    def reset!
      @@persons = []
    end

    def add_person title, name
      @@persons << { title: title, name: name }
    end
  end
end

class MyPersons < Persons
  add_person 'Dr.', 'Bob'
  add_person 'Mr.', 'Jones'
end
0 голосов
/ 29 февраля 2012

После хорошего ночного сна и еще одного поиска в Google, я придумала ответ.Кажется, в Ruby есть метод #inherited;он вызывается, когда класс наследуется (духовно)

...