2017-05-10 15 views
0

メソッドが定義されているクラスに対してrequireがあります。私はattr_accessorでそれを持っています。私は完全な超過すればかなり確信しています。しかし、どこにどのように置いても、私はこのエラーを取り除くことができませんNoMethodError: undefined method "next_node" for nil:NilClass。私はTDDを使用するためにminitestを実行しており、この時点でスーパー・ハングアップしています。私はここにlist.head.next_nodeリンクリストクラスの初期化エラー

require './lib/node' 
class LinkedList 
    attr_accessor :head, 
       :next_node 

    def initialize(head = nil) 
    @head = head 
    @next_node = next_node 
    end 

    def append(sound) 
    #@next_node = nil 
    @head = Node.new(sound) 
    sound 
    end 

end 

をテストするとき、私はnil値を返すようにしようとしています

EDITは私のテスト方法

def test_does_head_move_value_to_next_node 
    list = LinkedList.new 
    list.head.next_node 
    # assert_nil list.head.next_node 
end 

答えて

1

LinkedList.newがあなたのinitializeを呼び出しますです。 headパラメータが送信されたため、デフォルトのnilが割り当てられます。 @head = head@head属性にnilを格納します。

その後、list.headは(すべて不要ではない)アクセサを使用し、前に格納されたnilを返します。その後.next_nodenilに送信されますが、NilClassはそのような方法を定義していません。 list.head.next_nodenext_nodeメソッドを呼び出すには、@headは、ではなく、LinkedListオブジェクトである必要があります。

あなたがその身を守るしたい場合は、使用できます。

list.head.next_node if list.head 

または左側がnilであるかどうかをチェックし、nil場合を返しますルビー2.3で導入された安全なナビゲーション演算子&.を使用

list.head&.next_node 

EDIT:あなたのコードでは無害であるが、他のいくつかの状況では全く予想外の何かをするかもしれない微妙なバグもありますので、(とメソッドでない場合を呼び出します)。

@next_node = next_node 

あなたはinitialize方法でnext_node変数を定義していないので、Rubyはあなたがアクセサを起動したいと結論します。このアクセサは@next_nodeを返しますので、@next_node = @next_nodeになります。幸いにも、@next_nodeはすでにnilとして開始されているため、割り当ては完全には不要ですが、少なくとも失敗しません。しかし

、あなたのアクセサを定義した場合は、自分自身は、このように言う:(@next_nodeを返し、それがnilであれば、最初、新しい空のLinkedListを作る@next_nodeとして設定して、それを返す)

def next_node 
    @next_node ||= LinkedList.new 
end 

LinkedList.newと言う場合、@next_nodeLinkedList.newを割り当てようとすると、その@next_nodeLinkedList.newを割り当てようとします。これは、その@next_nodeLinkedList.newを割り当てようとします。 .. Ctrl-C

+0

すべて未定義のメソッドエラーを修正しますか?私は今、この一歩に集中しています。私の次のステップは 'assert_nil list.head.next_node'です。戻り値として' nil'を与えるようにしているからです。また、 'pry'セッションで呼び出されると、私が探している' nil'結果が得られます。私はエラーをクリアするためにここのコードにそれを含めることはできません。 –

+1

"すべてが"あなたの理解を修正しようとしていました。もし 'list.head'が' nil'なら 'list.head.next_node'を評価することはできません。 ( 'list.head&.next_node'では可能ですが、そのような場合は' nil'と評価されます) – Amadan

+0

OK私は覚えていると思います。私はおそらくコメントする前にそれで眠っていたはずです。私はお詫び申し上げます:P。テストで*実行しないで*実行したときにコードが書き込まれる方法は無限ループになります。 –

関連する問題