Ruby beginner here.
I noticed the following code in the pickaxe book 1.9 page 101:
class VowelFinder
include Enumerable
def initialize(string) @string = string
end
def each @string.scan(/[aeiou]/) do |vowel|
yield vowel
end
end
end
What does it mean to have a yield inside a block? I thought yield is
the way a method calls the block. Here the only yield is inside a block
and there is no other method.
What does it mean to have a yield inside a block? I thought yield is
the way a method calls the block. Here the only yield is inside a block
and there is no other method.
The yield is inside #each. It invokes the block passed to method #each.
Note this:
irb(main):001:0> def t; yield :pre; 2.times {|i| yield i}; yield :post;
end
=> nil
irb(main):002:0> t {|x| p x}
:pre
0
1
:post
=> :post
As you can see, yield invokes the block no matter where inside method #t
it
is placed.
Ruby beginner here.
I noticed the following code in the pickaxe book 1.9 page 101:
class VowelFinder
include Enumerable
def initialize(string) @string = string
end
def each @string.scan(/[aeiou]/) do |vowel|
yield vowel
end
end
end
What does it mean to have a yield inside a block?
‘yield’ calls a block. Which block? yield calls the block that
was specified when calling ‘the method’. Which method? The
method that contains the yield statement. So, work your way outwards
from the yield statement until you find a def statement. That is ‘the
method’ whose block will be called by yield.
A block that happens to be inside a method is not “the method’s
block”. The method’s block is specified when you call the method.
So if you see a block inside a method, you know for sure yield
is not calling that block.
Here the only yield is inside a block
and there is no other method.
If yield wasn’t allowed inside a block(e.g. a loop), which is inside a
method, then you would have to write methods like this: