したがって、私が正しく理解している場合、Object#tap は yield を使用して、プロセスまたはメソッドの実行中に操作する一時オブジェクトを生成します。私がyieldについて知っていると思うことから、yieldは(物)を取り、それが使用されているメソッドに添付されたブロックに(物).dupを与えるようなことをしますか?しかし、私がこれを行うとき:
class Klass
attr_accessor :hash
def initialize
@hash={'key' => 'value'}
end
end
instance=Klass.new
instance.instance_variable_get('@hash')[key] # => 'value', as it should
instance.instance_variable_get('@hash').tap {|pipe| pipe['key']=newvalue}
instance.instance_variable_get('@hash')[key] # => new value... wut?
私は、yield -> new_obj という印象を受けました。これがどれほど正しいかはわかりませんが、ruby-doc で調べてみましたが、Enumerator::yielder が空で、yield(proc) がなく、ファイバー バージョンがありません。実際、Rubyはそれらを使用するために「ファイバー」を明示的に含める必要はありませんか?
したがって、インスタンス変数の読み取りメソッドと temp の書き込みは、代わりにインスタンス変数の読み取り/書き込みになるはずです...これはクールです。ハッシュをインスタンス変数として処理する方法 (変数の名前付き配列の使用に慣れているテーブルよりも大きい場合) を作成しましたが、今は少し混乱しており、その説明が見つかりません。それを可能にしているメカニズム。