Forum: Ruby each with arguments

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Charles C. (Guest)
on 2006-05-11 18:57
(Received via mailing list)
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
Mike S. (Guest)
on 2006-05-11 19:06
(Received via mailing list)
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.
Alder G. (Guest)
on 2006-05-11 19:06
(Received via mailing list)
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
Charles C. (Guest)
on 2006-05-11 19:10
(Received via mailing list)
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.... :(

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
Alder G. (Guest)
on 2006-05-11 19:13
(Received via mailing list)
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
Mike S. (Guest)
on 2006-05-11 19:20
(Received via mailing list)
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.... :(
>
> 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.
Robert K. (Guest)
on 2006-05-11 19:35
(Received via mailing list)
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
Alder G. (Guest)
on 2006-05-11 20:36
(Received via mailing list)
On 5/11/06, Robert K. <removed_email_address@domain.invalid> wrote:
>
> robert
>
>

cool, didn't know about that one!

-Alder
This topic is locked and can not be replied to.