Ruby 1.9.2를 사용하여 DictionaryPresenter
클래스를 Enumerable
까지 확장 시키길 원하지만 each
메소드에서 오류가 발생합니다. 이 오류는 initialize
에 올바르게 할당 되었더라도 dictionary
은 nil
입니다.왜이 인스턴스 변수의 값이 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>'
감사합니다. 나는 인스턴스 변수를 사용하지 않기 위해 그것을 과도하게 사용했다. – ben
"클래스 메서드 내의 모든 변수 할당에 해당됩니다."라는 의미를 설명해 주시겠습니까? 아마도 setter라는 또 다른 방법은'send (: dictionary =, dictionary_hash)'이거나 인스턴스 변수를 직접 참조 할 수 있다는 점에 유의할 가치가 있습니다 ('@dictionary = ..'). 사소한 점 : initialize는 생성자가 아닌 일반적인 메소드 일뿐입니다 ('new'는 아닐 수도 있지만 더 가깝습니다). –