2014-01-05 7 views
0

Ruby 1.9.2를 사용하여 DictionaryPresenter 클래스를 Enumerable까지 확장 시키길 원하지만 each 메소드에서 오류가 발생합니다. 이 오류는 initialize에 올바르게 할당 되었더라도 dictionarynil입니다.왜이 인스턴스 변수의 값이 nil입니까?

@dictionary을 직접 사용하는 대신 dictionary에 대한 속성 방법을 사용하는 것과 관련이 있다고 생각합니다. 나는 가능한 한 속성 메소드와 인스턴스 변수 사용을 대체해야한다고 읽었습니다. 이것이 제가 한 일입니다.

class DictionaryPresenter 
    include Enumerable 
    attr_accessor :dictionary 
    private :dictionary 
    def initialize(collection) 
    dictionary = dictionary_hash 
    collection.each do |element| 
     dictionary[element[0].capitalize] << element 
    end 
    p 'dictionary has been filled. it is' 
    p dictionary 
    end 
    def dictionary_hash 
    ('A'..'Z').reduce({}) do |hash, letter| 
     hash[letter] = [] 
     hash 
    end 
    end 
    def each(&blk) 
    p 'in each' 
    p dictionary 
    dictionary.each(&blk) 
    end 
end 
p DictionaryPresenter.new(['abba', 'beegees']).map{ |a| a } 

출력 생성자에서

"dictionary has been filled. it is" 
{"A"=>["abba"], "B"=>["beegees"], "C"=>[], "D"=>[], "E"=>[], "F"=>[], "G"=>[], "H"=>[], "I"=>[], "J"=>[], "K"=>[], "L"=>[], "M"=>[], "N"=>[], "O"=>[], "P"=>[], "Q"=>[], "R"=>[], "S"=>[], "T"=>[], "U"=>[], "V"=>[], "W"=>[], "X"=>[], "Y"=>[], "Z"=>[]} 
"in each" 
nil 
anki.rb:22:in `each': undefined method `each' for nil:NilClass (NoMethodError) 
    from anki.rb:25:in `map' 
    from anki.rb:25:in `<main>' 

답변

1

을, 당신은 self.dictionary = dictionary_hash 대신 dictionary = dictionary_hash 사용해야합니다.

사용자 버전 (dictionary = ...)은 생성자 내에 로컬 변수를 생성하고 값을 할당합니다. 실제로 사용자가 정의한 attr_accessor을 사용하지 않습니다. 이것은 클래스 메소드 내의 모든 변수 할당에 해당됩니다. 설정자 (명시 적으로 def field= 또는 attr_accessor :field으로 정의한 방법)를 사용하려면 field = 대신 self.field =을 사용해야합니다.

+0

감사합니다. 나는 인스턴스 변수를 사용하지 않기 위해 그것을 과도하게 사용했다. – ben

+0

"클래스 메서드 내의 모든 변수 할당에 해당됩니다."라는 의미를 설명해 주시겠습니까? 아마도 setter라는 또 다른 방법은'send (: dictionary =, dictionary_hash)'이거나 인스턴스 변수를 직접 참조 할 수 있다는 점에 유의할 가치가 있습니다 ('@dictionary = ..'). 사소한 점 : initialize는 생성자가 아닌 일반적인 메소드 일뿐입니다 ('new'는 아닐 수도 있지만 더 가깝습니다). –

관련 문제