2014-11-27 3 views
1

Я новичок в рубинрубин неопределенный метод `pair_push» для ноль: NilClass (NoMethodError)

Я создал свой собственный класс карты

class MyMap 
    attr_accessor :key,:value 
    def initialize 
     self.key = [] 
     self.value = [] 
    end 

    def pair_push(k, v) 
     self.key.push(k) 
     self.value.push(v) 
    end 

    ...  
end 

И мой собственный объект JSon

class Json 
    attr_accessor :index,:data 
    def initialize 
     index=MyMap.new 
     data=MyMap.new 
    end 
    def create_index(_index, type, id) 
     index.pair_push("_index", _index) 
     index.pair_push("_type", type) 
     index.pair_push("_id", id) 
    end 

    def add_to_data(attName, value) 
     data.pair_push attName, value 
    end 
    ... 
end 

Но когда я пытаюсь использовать add_to_data jsonDst.add_to_data(attributeName, arr[i]) Я получаю следующее сообщение об ошибке

helloWorld.rb:66:in `add_to_data': undefined method `pair_push' for nil:NilClass (NoMethodError) 

Обратите внимание, прежде чем я призываю add_to_data я проверить, что attributeName != nil && arr[i] != nil

ответ

1

В конструкторе вы должны использовать @instance_variables. В вашем конструкторе класса Json, когда вы ссылаетесь на data, это просто неосвещенная локальная переменная. Вместо этого вы должны использовать @data. То же самое относится и к @index:

class Json 
    attr_accessor :index,:data 
    def initialize 
     @index=MyMap.new 
     @data=MyMap.new 
    end 
    def create_index(_index, type, id) 
     index.pair_push("_index", _index) 
     index.pair_push("_type", type) 
     index.pair_push("_id", id) 
    end 

    def add_to_data(attName, value) 
     data.pair_push attName, value 
    end 
    ... 
end 

Вот как это работает: http://ideone.com/mpLroq

+0

Это на самом деле действительно, из-за 'attr_accessor: индекс: data'. – August

+0

@ Август право, исправится в секунду – GolfWolf

+0

@ w0lf проверил это, и он работает благодаря –

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