回答編集履歴

1

追記

2018/09/08 15:32

投稿

asm
asm

スコア15147

test CHANGED
@@ -33,3 +33,147 @@
33
33
  なので、`@left.each(&block) if @left`は、条件を満たさず実行されないときがいつか来ます
34
34
 
35
35
  そしたら、自身をブロックに渡し(`block.call(data)`)ます。
36
+
37
+
38
+
39
+ ---
40
+
41
+
42
+
43
+ **追記**
44
+
45
+ 値を取り出せる事を不思議がってるようなので簡単にしてみます。
46
+
47
+
48
+
49
+ ```rb
50
+
51
+ class Val
52
+
53
+ def initialize(val)
54
+
55
+ @val = val
56
+
57
+ end
58
+
59
+ def each(&blk)
60
+
61
+ blk.call @val
62
+
63
+ end
64
+
65
+ end
66
+
67
+
68
+
69
+ Val.new(100).each{|el| p el} # => 100
70
+
71
+ ```
72
+
73
+
74
+
75
+ クラス`Val`は値1つを保持し、`Val#each`メソッドは保持してる値を引数としてブロックを呼び出します。
76
+
77
+
78
+
79
+ 次に連結リストを考えます。
80
+
81
+ ```rb
82
+
83
+ class LinkedList
84
+
85
+ def initialize(val)
86
+
87
+ @val = val
88
+
89
+ end
90
+
91
+ def <<(val)
92
+
93
+ @link = LinkedList.new val
94
+
95
+ end
96
+
97
+ def each(&blk)
98
+
99
+ blk.call(@val)
100
+
101
+ @link.each(&blk) if @link
102
+
103
+ end
104
+
105
+ def rev_each(&blk)
106
+
107
+ @link.rev_each(&blk) if @link
108
+
109
+ blk.call(@val)
110
+
111
+ end
112
+
113
+ end
114
+
115
+
116
+
117
+ ll = LinkedList.new(1)
118
+
119
+ ll << 2 << 3 << 4 << 5
120
+
121
+ pp ll
122
+
123
+ # => #<LinkedList:0x0000000006a9e128
124
+
125
+ # @link=
126
+
127
+ # #<LinkedList:0x0000000006b7f8d0
128
+
129
+ # @link=
130
+
131
+ # #<LinkedList:0x0000000006b7f880
132
+
133
+ # @link=
134
+
135
+ # #<LinkedList:0x0000000006b7f858
136
+
137
+ # @link=#<LinkedList:0x0000000006b7f830 @val=5>,
138
+
139
+ # @val=4>,
140
+
141
+ # @val=3>,
142
+
143
+ # @val=2>,
144
+
145
+ # @val=1>
146
+
147
+
148
+
149
+ ll.each{|el| p el}
150
+
151
+ # => 1
152
+
153
+ # 2
154
+
155
+ # 3
156
+
157
+ # 4
158
+
159
+ # 5
160
+
161
+ ll.rev_each{|el| p el}
162
+
163
+ # => 5
164
+
165
+ # 4
166
+
167
+ # 3
168
+
169
+ # 2
170
+
171
+ # 1
172
+
173
+ ```
174
+
175
+ @valをブロックに渡した後に
176
+
177
+ @listが偽でないならば@listのメソッドも同様に`each`メソッドを呼び出してやる事で
178
+
179
+ 値を取り出していく事ができます。