[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

exit a block

Jim

2/20/2007 4:15:00 PM


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-....

5 Answers

Robert Klemme

2/20/2007 4:22:00 PM

0

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.

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

Jim

2/20/2007 4:45:00 PM

0


Thanks for your help, sometimes best just to program an old fashion for
loop ;)

Thanks,
Jim.

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

Austin Ziegler

2/20/2007 5:52:00 PM

0

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 ;)

...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.halo...
* austin@halostatue.ca * http://www.halo...feed/
* austin@zieglers.ca

Louis J Scoras

2/20/2007 10:02:00 PM

0

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 ;)

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


--
Lou.

Suraj Kurapati

2/21/2007 2:43:00 AM

0

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-....