{"record":{"id":"c802bf68696b4c58","repo":"krahets/hello-algo","slug":"error-c802bf","errorCode":null,"errorMessage":"両端キューは空です","messagePattern":"両端キューは空です","errorType":"exception","errorClass":"IndexError","httpStatus":null,"severity":"error","filePath":"ja/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb","lineNumber":70,"sourceCode":"      node.prev = @rear\n      @rear = node # 末尾ノードを更新する\n    end\n    @size += 1 # キューの長さを更新\n  end\n\n  ### キュー先頭に追加 ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### キュー末尾に追加 ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### デキュー操作 ###\n  def pop(is_front)\n    raise IndexError, '両端キューは空です' if is_empty?\n\n    # キュー先頭からの取り出し\n    if is_front\n      val = @front.val # 先頭ノードの値を一時保存\n      # 先頭ノードを削除\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # 先頭ノードを更新する\n    # キュー末尾からの取り出し\n    else\n      val = @rear.val # 末尾ノードの値を一時保存\n      # 末尾ノードを削除\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/krahets/hello-algo/blob/69932aed1891a7b7f6a0de88cd116d3fe13e7032/ja/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb#L52-L88","documentation":"Raised by LinkedListDeque#pop (ja/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb:70) when the deque is empty. pop(is_front) unlinks either the head or tail node; with size == 0 there is no node, so the guard blocks it. pop_first/pop_last delegate here. Message: \"両端キューは空です\" (Deque is empty). Japanese mirror of error 543.","triggerScenarios":"Calling deque.pop_first or deque.pop_last when deque.size == 0 — before any push_first/push_last, or after every node has been removed.","commonSituations":"A two-ended buffer drained past empty; deque-as-worklist fully consumed; test popping in pairs without checking size.","solutions":["Check deque.is_empty? before pop_first/pop_last.","Verify deque.size is sufficient (>= 1, or >= 2 for paired pops).","Rescue IndexError around the pop and treat empty as the loop's exit."],"exampleFix":"# before\nwhile true\n  deque.pop_last # raises once drained\nend\n\n# after\nuntil deque.is_empty?\n  deque.pop_last\nend","handlingStrategy":"validation","validationCode":"deque.pop_last unless deque.is_empty?","typeGuard":"def deque_nonempty?(d); d.respond_to?(:is_empty?) && !d.is_empty?; end","tryCatchPattern":"begin\n  deque.pop_last\nrescue IndexError\n  nil\nend","preventionTips":["Check is_empty? before pop_first/pop_last.","Require sufficient size before paired front+rear pops.","Make size == 0 the termination condition of drain loops."],"tags":["ruby","deque","linked-list","precondition","indexerror","i18n-japanese"],"backgroundTag":null,"analyzedSha":"69932aed1891a7b7f6a0de88cd116d3fe13e7032","analyzedAt":"2026-08-13T23:02:37.581Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}