Exit a block

I need to step through a byte array untill I find a certain value, then
I need to check that the next item in the array is a certain value, it
is the first index that I require.

So two questions:

1. How would you do it? (my ruby sucks, so interested in seeing decent
code)

2. If your in a block
     i.e.
         myarray.each_with_index{|a,i| if(a == 666):return i end}
then how can you exit the block and return a value without continuing
through the loop.

Thanks,
Jim.

···

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

You can use break or if inside a method return will work as well. I.e. you could do

# straightforward simple solution
def find_my_index(arr)
   for i in 0 ... arr.length-1
     return i if arr[i] == 66 and arr[i+1] == 55
   end
   # not found
   nil
end

Of course there is a ton of other possible solutions... I find break often not as useful as return because it has the drawback that Array#each will always return the array item itself if you do not break in between. That way you have to check the return value of #each which I find inelegant.

Kind regards

  robert

···

On 20.02.2007 17:15, Jim Bob wrote:

I need to step through a byte array untill I find a certain value, then
I need to check that the next item in the array is a certain value, it
is the first index that I require.

So two questions:

1. How would you do it? (my ruby sucks, so interested in seeing decent
code)

2. If your in a block
     i.e.
         myarray.each_with_index{|a,i| if(a == 666):return i end}
then how can you exit the block and return a value without continuing
through the loop.

Thanks for your help, sometimes best just to program an old fashion for
loop :wink:

Thanks,
Jim.

···

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

...except that:

  for a in b
    return a if a > 5
  end

...is the same as:

  b.each { |a| return a if a > 5 }

(Except in matters of scope.)

-austin

···

On 2/20/07, Jim Bob <james_b@anytimenow.com> wrote:

Thanks for your help, sometimes best just to program an old fashion for
loop :wink:

--
Austin Ziegler * halostatue@gmail.com * http://www.halostatue.ca/
               * austin@halostatue.ca * You are in a maze of twisty little passages, all alike. // halo • statue
               * austin@zieglers.ca

Nahh, more abstraction is a good thing =)

    require 'enumerator'
    class Array
      def find_my_index(x,y)
        to_enum(:each_with_index).each_cons(2) {|(a,i),(b,_)|
          return i if a == x && b == y
        }
        nil
      end
    end

And then it's just:

    ary = [43,21,56,12,93,12]

    puts ary.find_my_index(12,93) # => 3
    puts ary.find_my_index(93,12) # => 4
    puts ary.find_my_index(56,100) # => nil

···

On 2/20/07, Jim Bob <james_b@anytimenow.com> wrote:

Thanks for your help, sometimes best just to program an old fashion for
loop :wink:

--
Lou.

If it can be compromised to have another variable,
its more like the ruby way ...

lets say myarray=[1,2,3,666,7]

myarray.each_with_index{|a,i| index = i and break if a == 666 }

index # => 3

···

On 2/20/07, Austin Ziegler <halostatue@gmail.com> wrote:

On 2/20/07, Jim Bob <james_b@anytimenow.com> wrote:
> Thanks for your help, sometimes best just to program an old fashion for
> loop :wink:

...except that:

  for a in b
    return a if a > 5
  end

...is the same as:

  b.each { |a| return a if a > 5 }

(Except in matters of scope.)

-austin
--
Austin Ziegler * halostatue@gmail.com * http://www.halostatue.ca/
               * austin@halostatue.ca * You are in a maze of twisty little passages, all alike. // halo • statue
               * austin@zieglers.ca

--
sur
http://expressica.com

Lou Scoras wrote:

    require 'enumerator'
    class Array
      def find_my_index(x,y)
        to_enum(:each_with_index).each_cons(2) {|(a,i),(b,_)|
          return i if a == x && b == y
        }
        nil
      end
    end

I prefer to leave the actual searching to the Array class. Who knows, it
might cache a partial-order tree representation of the array and use
some micro-optimized search algorithm that performs O(log n) on average?

Here is a short one-line solution in that spirit:

  class Array
    def find_my_index x, y
      i = index(x) and self[i+1] == y and i
    end
  end

Here is a more human readable version, if you don't mind two extra
lines:

  class Array
    def find_my_index x, y
      if i = index(x) and self[i+1] == y
        i
      end
    end
  end

···

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