3

クラスを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
4

1 に答える 1

0

findメソッドはブロックを呼び出すことはなく、どこにも保存せず、別のメソッドに渡さず、ブロックに対して何もしません。無視するだけです。したがって、あなたのremove!方法は本当に

def remove!(list_item)
  find list_item
end
于 2012-10-10T08:09:08.653 に答える