2012-02-29 2 views
0

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

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 

ответ

0

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

Собственно, так Синатра реализует переменные экземпляра в Sinatra::Base.

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

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

    def inherited child 
     child.reset! 
    end 
    end 
end 

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

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

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

Вторая часть - мой вопрос. Как я могу инициализировать «лиц» без вызова метода в дочерних классах? –

+0

только что отредактировал мой ответ, надеюсь, ответит на этот вопрос. –

Смежные вопросы