# Newbie question about blocks

**URL:** <https://www.ruby-forum.com/t/newbie-question-about-blocks/66282>\
**Category:** Ruby\
**Created:** [February 12, 2006, 10:50pm UTC](https://www.ruby-forum.com/t/newbie-question-about-blocks/66282 "2006-02-12T22:50:11Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![braas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/f04885/32.png) [@braas](https://www.ruby-forum.com/u/braas)\
**Post date:** [February 12, 2006, 10:50pm UTC](https://www.ruby-forum.com/t/newbie-question-about-blocks/66282/1 "2006-02-12T22:50:11Z")

</div>

Hi, I want to square every element in my array using a block:

a = (1…1000).to\_a  
a.each {|x| x\*\*2}

But this does not seem to work, it just outputs my array completely  
unchanged ☹

---

<div class="post-metadata">

**Author:** ![braas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/f04885/32.png) [@braas](https://www.ruby-forum.com/u/braas)\
**Post date:** [February 12, 2006, 10:54pm UTC](https://www.ruby-forum.com/t/newbie-question-about-blocks/66282/2 "2006-02-12T22:54:21Z")

</div>

Hi –

On Mon, 13 Feb 2006, Jeppe J. wrote:

> Hi, I want to square every element in my array using a block:
> 
> a = (1…1000).to\_a  
> a.each {|x| x\*\*2}
> 
> But this does not seem to work, it just outputs my array completely  
> unchanged ☹

What you want is map, rather than each:

a.map {|x| x\*\*2 }

each just returns the receiver (i.e., the array itself). map returns  
a new array, composed of the results obtained by running the block  
once for each item.

“collect” is a synonym for map.

David

–  
David A. Black (removed\_email\_address@domain.invalid)  
Ruby Power and Light ([http://www.rubypowerandlight.com](http://www.rubypowerandlight.com))

“Ruby for Rails” chapters now available  
from Manning Early Access Program! [Ruby for Rails](http://www.manning.com/books/black)

---

<div class="post-metadata">

**Author:** ![braas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/f04885/32.png) [@braas](https://www.ruby-forum.com/u/braas)\
**Post date:** [February 12, 2006, 10:56pm UTC](https://www.ruby-forum.com/t/newbie-question-about-blocks/66282/3 "2006-02-12T22:56:26Z")

</div>

The problem you’re seeing is that :each doesn’t do anything with the  
return values of the block.

What you want is :map or :collect (or their destructive forms :map! or  
:collect!).

---

<div class="post-metadata">

**Author:** ![braas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/f04885/32.png) [@braas](https://www.ruby-forum.com/u/braas)\
**Post date:** [February 12, 2006, 11:03pm UTC](https://www.ruby-forum.com/t/newbie-question-about-blocks/66282/4 "2006-02-12T23:03:56Z")

</div>

Jeppe J. wrote:

> 

The collect method will produce a new array:

a.collect {|x| x\*x}

or, if you want to modify the original array, use collect!

---

<div class="post-metadata">

**Author:** ![braas](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/f04885/32.png) [@braas](https://www.ruby-forum.com/u/braas)\
**Post date:** [February 12, 2006, 11:34pm UTC](https://www.ruby-forum.com/t/newbie-question-about-blocks/66282/5 "2006-02-12T23:34:05Z")

</div>

Hi –

On Mon, 13 Feb 2006, Daniel N. wrote:

> return values of the block.
> 
> What you want is :map or :collect (or their destructive forms :map! or  
> :collect!).

But probably the methods, not the like-named symbols 🙂

David

–  
David A. Black (removed\_email\_address@domain.invalid)  
Ruby Power and Light ([http://www.rubypowerandlight.com](http://www.rubypowerandlight.com))

“Ruby for Rails” chapters now available  
from Manning Early Access Program! [Ruby for Rails](http://www.manning.com/books/black)
