Generator#yield - what does it do?

  • Thread starter Wolfgang Nádasi-Donner
  • Start date
W

Wolfgang Nádasi-Donner

Hi!

I am confused somehow with respect to "Generator#yield". The description
(ri) is...
ri Generator#yield
-------------------------------------------------------- Generator#yield
yield(value)
------------------------------------------------------------------------
Yields an element to the generator.

It's unclear for me what this means. I would expect that the Generator
object delivers (yields) values by requirement through
"Generator#current" or "Generator#next", but what should be yielded to
an already existing Generator object?

Wolfgang Nádasi-Donner
 
M

MonkeeSage

Hi!

I am confused somehow with respect to "Generator#yield". The description
(ri) is...


-------------------------------------------------------- Generator#yield
yield(value)
------------------------------------------------------------------------
Yields an element to the generator.

It's unclear for me what this means. I would expect that the Generator
object delivers (yields) values by requirement through
"Generator#current" or "Generator#next", but what should be yielded to
an already existing Generator object?

Wolfgang Nádasi-Donner

It's for passing items *into* the generator's queue when the generator
is created with the block form of Generator#new rather than from an
existing enumerable. Example...

require 'generator'
g = Generator.new { | g |
1.upto(9) { | i |
g.yield(i)
}
g.yield(10)
}
until g.end?
p g.next
end

It probably should be spelled "inject" or something.

Regards,
Jordan
 
M

MonkeeSage

It's for passing items *into* the generator's queue when the generator
is created with the block form of Generator#new rather than from an
existing enumerable. Example...

require 'generator'
g = Generator.new { | g |
1.upto(9) { | i |
g.yield(i)
}
g.yield(10)}

until g.end?
p g.next
end

It probably should be spelled "inject" or something.

err... ^^^^^^^^ = "insert"
 
W

Wolfgang Nádasi-Donner

Jordan said:
It's for passing items *into* the generator's queue when the generator
is created with the block form of Generator#new rather than from an
existing enumerable. Example...

I see - the confusion came from the usual meaning of yield: call a block
and deliver objects to it. Here it is used from a block into a method.

btw. - at least in "PickAxe" the word "yield" it marked as a reserved
word.

Wolfgang Nádasi-Donner
 
M

MonkeeSage

I see - the confusion came from the usual meaning of yield: call a block
and deliver objects to it. Here it is used from a block into a method.

Yes... it really should be spelled differently. The idea is "send this
item into the generator queue, so that the generator yields it (normal
meaning) on the next iteration"...but it is confusing to have it named
yield.
btw. - at least in "PickAxe" the word "yield" it marked as a reserved
word.

Object attributes can share the same name as reserved words since they
live in the namespace of the caller. Example...

class Control
def if(cond, yes, no) # 'if' is a reserved keyword
if instance_eval(cond) then yes else no end
end
end
Control.new.if("5>4", "ok", "broken")
# => "ok"
Wolfgang Nádasi-Donner

Regards,
Jordan
 
W

Wolfgang Nádasi-Donner

David said:
Reserved words can still be method names (e.g., class). It would be
nice to have a different word for this method, since it does feel a
bit backwards in relation to the other "yield", but as I recall there
have been discussions already and nothing that Matz liked was
proposed.

I think the documentation of the method should be a little bit extended.
The name of the method is not as bad as it looks like in the first
moment, because it is used in the way to "yield" a value later to the
user of the generator.

After yours and Jordan's explanations everything is clear now. It's
simply the documentation text "Yields an element to the generator",
which leads to the assumption, that the method can be called elsewhere
and delivers some objekt to the existing generator.

Wolfgang Nádasi-Donner
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,271
Messages
2,571,361
Members
48,043
Latest member
BartEaster

Latest Threads

Top