クラスをList
実装したNode
クラスがあります。私の#remove!
方法は次のとおりです。
def remove!(list_item)
find list_item do |i|
if i == nil
return
else
i.pointer = i.pointer.pointer
end
end
end
#find
私が期待するように、検索されたデータを含むノードの前のノードを返します。したがって、これにより、前のアイテムのポインタが検索されたアイテムの後のオブジェクトに設定され、現在のアイテムがリストから削除されるはずです。
これはブロックのスコープに関係していると思います。ブロックにi
渡されたものは、ブロック内にあるはずのオブジェクトを直接参照していないため、ポインターの値を上書きすることはできません。事前に値を明示的に宣言せずに、このブロックにこの値を変更させるにはどうすればよいですか(これにより、このブロックの目的が無効になります)。
この#find
メソッドと「#traverse」メソッドは期待どおりに動作するため、このブロックが原因である必要があると思います。関数型プログラミングに興味があり、試してみたいので、同じ関数呼び出しを2回行うことや、使い捨て変数を宣言することは避けようとしています。
リクエストごとに編集:
githubの完全なコード
#find
方法_
def find(item_to_find, current_item = @sentinel.pointer, previous_item = @sentinel)
if current_item == @sentinel then puts "not found"; return nil end
if current_item.datum == item_to_find
return previous_item
else
find item_to_find, current_item.pointer, current_item
end
end