For is almost a lump of syntactic sugar in ruby!
Do you know for
is almost a lump of syntactic sugar in ruby?
Yes, the for
in ruby is not like that in others.
When you write
for i in collection
p i
end
Ruby translates it into sth like:
collection.each do |i|
p i
end
But, the difference is that each
invokes the block of code repeatly, while for
is just a language construct.
So if the variable has existed before the block, that in the block is the same with the outside one. But if the variable appears only inside the block, it's local to the block, it can't be accessed anywhere outside the block.
There is a good example to explain it: https://gist.github.com/4109520
Written by Tony612
Related protips
11 Responses
Cool. I never liked for anyway; happy to know it doesn't really exists :)
Ruby has a for statement?! O.o And it's just a sugar over #each? Ah, useless~
For would be more useful if it was sugar on map and flatMap like in Scala. Anyway, good to know. Thanks.
No, it isn't.
foo.each do |blah|
...
end
creates a new lexical scope for the block,
for i in foo
...
end
Does not. If you don't know what you're talking about, please don't preach. You're misleading people.
@richoh . I don't want to mislead people. I just read the Loops part in the book <Programming Ruby>(1.9,3rd) at Page 162. It said that the only built-in Ruby looping primitives were while
and until
, for
is almost a lump of syntactic sugar. And you can use for
loop only if your class define a each
method
Yeah, you read it wrong.
For doesn't create any local scope. Example here: https://gist.github.com/4109520
@richoh I think I have known what your meaning is. I forget to mention the different between them. Thank your very much. I'll fix it ~
I don't get it. Have you updated it? This is still blatantly wrong.
@richoh It's ok now?
Not really. I think you're trying to explain something you don't really understand. Which is fine.. but you probably shouldn't be teaching your interpretation as fact.
When you invoke each
you're defining a block, which is a binding complete with it's own local scope and then passing that into the each
method, which calls your block once for each value in the set.
`
block = Proc.new do |v|
puts v
end
[1, 2, 3].each(&block)
[4, 5, 6].each(&block)
`
The block is an entirely seperate entity.The for loop is a language construct.
@richoh thank you again. I just updated it. Is there something wrong?