前提・実現したいこと
こんばんは。
入れ子になったインスタンスに対してeach, rev_eachメソッドを呼び出すことで、各インスタンスが持つ**@valの値を取り出したいのですが、以下のコードでrev_each**が動く仕組みが分かりません。
@link.rev_each(&blk) if @linkで**@val = 5を持つLinkedListのインスタンスまで降りていくことで、eachメソッドとは逆に@valの値を5から取り出すことができるという点までは分かるのですが、なぜ@val = 5のインスタンスまで潜ったあとに@val = 4**のインスタンスのインスタンス変数を引数にしてブロックを実行できるのでしょうか?
@val = 5のインスタンスまで潜った後に、ブロックを実行してメソッドが終了するように見えるのですが、継続して入れ子のインスタンスを遡ることができる仕組みを教えて頂きたいです。
よろしくお願いします。
該当のソースコード
class LinkedList def initialize(val) @val = val end def <<(val) @link = LinkedList.new val end def each(&blk) blk.call(@val) @link.each(&blk) if @link end def rev_each(&blk) @link.rev_each(&blk) if @link blk.call(@val) end end ll = LinkedList.new(1) ll << 2 << 3 << 4 << 5 pp ll # => #<LinkedList:0x0000000006a9e128 # @link= # #<LinkedList:0x0000000006b7f8d0 # @link= # #<LinkedList:0x0000000006b7f880 # @link= # #<LinkedList:0x0000000006b7f858 # @link=#<LinkedList:0x0000000006b7f830 @val=5>, # @val=4>, # @val=3>, # @val=2>, # @val=1> ll.each{|el| p el} # => 1 # 2 # 3 # 4 # 5 ll.rev_each{|el| p el} # => 5 # 4 # 3 # 2 # 1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/13 13:26