Each with arguments


#1

I’ve found myself writing the following code to address needs I have
processing formatted text files, but is this possible some other and I
am going through foolish gyrations here…

Here is the code:

class Array
alias :orig_each :each
def each(cnt = 1, &blk)
if cnt == 1
orig_each { |x| blk.call(x) }
else
0.step(self.size - 1,cnt) do |i|
yield(self.slice(i,cnt))
end
end
end
end

so I can do things like this

arr = [ key, value, value, key, value, value, key, value, value, … ]
arr.each(3) do |key,val1,val2|
#manipulate them as I see fit
end

Thanks for any help you can give!

Charles C.
Account Executive
Datatek, Inc.
800 536-4835 ext. 145
1 919 425-3145 (international)
removed_email_address@domain.invalid


#2

On 11-May-06, at 10:53 AM, Charles C. wrote:

     orig_each { |x| blk.call(x) }

arr = [ key, value, value, key, value, value, key, value, value, … ]
arr.each(3) do |key,val1,val2|
#manipulate them as I see fit
end

Thanks for any help you can give!

Have you looked at Enumerable#each_slice which is included in Array?

ratdog:~ mike$ ri Enumerable#each_slice
-------------------------------------------------- Enumerable#each_slice
e.each_slice(n) {…}

  Iterates the given block for each slice of <n> elements.

  e.g.:

      (1..10).each_slice(3) {|a| p a}
      # outputs below
      [1, 2, 3]
      [4, 5, 6]
      [7, 8, 9]
      [10]

Mike

Mike S. removed_email_address@domain.invalid
http://www.stok.ca/~mike/

The “`Stok’ disclaimers” apply.


#3

On 5/11/06, Charles C. removed_email_address@domain.invalid wrote:

    orig_each { |x| blk.call(x) }

arr = [ key, value, value, key, value, value, key, value, value, … ]
1 919 425-3145 (international)
removed_email_address@domain.invalid

require ‘enumerator’
(1…9).to_enum.each_slice(3) { |x, y, z| puts “%i %i %i” % [x, y, z] }

1 2 3
4 5 6
7 8 9

-Alder


#4

Mike S. wrote:

alias :orig_each :each
     [1, 2, 3]
     [4, 5, 6]
     [7, 8, 9]
     [10]

Mike

exacly what I was looking for. I had checked the ruby docs, but only
looked under Array… :frowning:

Sorry for the apparently stupid question.

Thanks,

Charles C.
Account Executive
Datatek, Inc.
800 536-4835 ext. 145
1 919 425-3145 (international)
removed_email_address@domain.invalid


#5

On 5/11/06, Mike S. removed_email_address@domain.invalid wrote:

alias :orig_each :each
     [1, 2, 3]

The “`Stok’ disclaimers” apply.

each_slice doesn’t wfm if I don’t require ‘enumerator’ first:

irb(main):001:0> (1…10).each_slice(3) {|a| p a}
(1…10).each_slice(3) {|a| p a}
NoMethodError: undefined method `each_slice’ for 1…10:Range
from (irb):1

irb(main):002:0> require ‘enumerator’
require ‘enumerator’
true

irb(main):003:0> (1…10).each_slice(3) {|a| p a}
(1…10).each_slice(3) {|a| p a}
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10]
nil


#6

You can as well use direct assignment, say if you want just every
third element you can do:

17:32:15 [~]: ruby -r enumerator -e ‘(1…10).each_slice(3) {|a,| p a}’
1
4
7
10

Kind regards

robert


#7

On 5/11/06, Robert K. removed_email_address@domain.invalid wrote:

robert

cool, didn’t know about that one!

-Alder


#8

On 11-May-06, at 11:09 AM, Charles C. wrote:

exacly what I was looking for. I had checked the ruby docs, but only
looked under Array… :frowning:

Sorry for the apparently stupid question.

Of course it would help if the answer was correct - see Alder G.'s
response.

I should have tried it before posting!

Mike

Mike S. removed_email_address@domain.invalid
http://www.stok.ca/~mike/

The “`Stok’ disclaimers” apply.