From: Yusuke ENDOH Date: 2011-07-18T14:30:43+09:00 Subject: [ruby-core:38155] Re: [Ruby 1.9 - Feature #4766] Range#bsearch Hello, Thank you for all your opinions! 2011/7/18 Michael Edgar : > This is handy, but what if someone wanted the maximum? Please invert the condition. For example, if you want the maximum index holding that the element is less than 7: ary = [0, 4, 7, 10, 12] p (0..4).bserach {|i| !(ary[i] < 7) } #=> 1 Indeed it is not so cool, but similar to Array#sort. If it is possible only by inverting, I'm afraid if we need paticular methods for each use case. > Or just the first element that matches? Good question :-) Interestingly, break can be used. ary = [0, 4, 7, 10, 12] p (0..4).bsearch {|i| break i if ary[i] >= 4 } #=> 1, 2, 3 or 4 (probably 2, but I don't think it might be changed in future extension) > an enumerator for all elements for which the block yields true. I agree that it seems neat, but it is ambiguous to me how it works concretely. What do you expect the following code outputs? ary = [0, 4, 7, 10, 12] p (0..4).bsearch_matches {|i| ary[i] >= 4 }.to_a #=> ? And, I guess binary_matches(&blk).min takes O(m) where m is the number of results because Enumearble#min and #max find the value by iterating all elements. -- Yusuke Endoh