Use of array shift and blocks

(Something a bit more basic than the other thread about the array shfit
bug!)

Given the following:

myArray=["a", "b", "c", "d"]
until myArray.empty?
  myArray.shift { |letter|
    puts letter
  }
end

... I would expect the letters a, b, c and d to be printed to the
screen, but I don't get anything (including no error message). Have I
misunderstood something about array shift and/or blocks?

···

--
Posted via http://www.ruby-forum.com/.

Hi --

(Something a bit more basic than the other thread about the array shfit
bug!)

Given the following:

myArray=["a", "b", "c", "d"]
until myArray.empty?
  myArray.shift { |letter|
    puts letter
  }
end

... I would expect the letters a, b, c and d to be printed to the
screen, but I don't get anything (including no error message). Have I
misunderstood something about array shift and/or blocks?

shift doesn't take a block. You can write one but shift won't call
it.

You could do this:

   until array.empty?
     puts array.shift
   end

David

···

On Mon, 25 Sep 2006, Toby Rodwell wrote:

--
                   David A. Black | dblack@wobblini.net
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] Ruby for Rails | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

change the code to:
myArray=["a", "b", "c", "d"]
until myArray.empty?
    letter = myArray.shift
    puts letter
end

depesz

···

On 2006-09-24, Toby Rodwell <ruby@tobyrodwell.com> wrote:

Given the following:
myArray=["a", "b", "c", "d"]
until myArray.empty?
  myArray.shift { |letter|
    puts letter
  }
end

--
mój boże, spraw abym milczał, dopóki się nie upewnię, że naprawdę mam
coś do powiedzenia. (c) 1998 depesz

unknown wrote:

...
shift doesn't take a block. You can write one but shift won't call
it.

You could do this:

   until array.empty?
     puts array.shift
   end

David

Many thanks David. I'm not sure I understand why shift doesn't take a
block, but thanks for confirming it.

regards
Toby

···

--
Posted via http://www.ruby-forum.com/\.

Hi --

unknown wrote:

...
shift doesn't take a block. You can write one but shift won't call
it.

You could do this:

   until array.empty?
     puts array.shift
   end

David

Many thanks David. I'm not sure I understand why shift doesn't take a
block, but thanks for confirming it.

I expect it's because shifting is a (conceptually) atomic operation.
If you need to examine what got shifted, you can get the return value.
If you need to examine the newly-shortened array, you can examine it
directly. There's really nothing for a block to do.

Consider, by way of contrast, something like String#sub, where you
find something and replace it with something -- and you might want to
have a handle on the 'something', in the middle, so that you can
manipulate it to generate the eventual replacement string.

David

···

On Mon, 25 Sep 2006, Toby Rodwell wrote:

--
                   David A. Black | dblack@wobblini.net
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] Ruby for Rails | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org