Если вы хотите, чтобы найти индекс элемента вместо самого элемента, вы должны использовать Array#bsearch_index
, Примечание: этот метод был введен в Ruby 2.3, который на момент написания этой статьи еще не выпущен (он будет выпущен на Рождество 2015 года).
feature request для Array#bsearch_index
содержит comment от Юсукэ ЭндоН, показывающий, как реализовать Array#bsearch_index
(и на самом деле Array#bsearch
, а) на основе Range#bsearch
:
class Array
def bsearch_index(&blk)
return enum_for(__method__) unless blk
(0...size).bsearch {|i| yield self[i] }
end
end
Когда либо работает Рубин 2.3 или с использованием указанной выше обезьяны патч, то вы можете сделать:
ary.bsearch_index(&1.method(:-))
для того, чтобы найти индекс 1
элемента в массиве.
Причина, почему он не работает с
ary.bsearch_index {|el | el - 1 }
проста: блок нарушает договор bsearch_index
(а также bsearch
, так как они одинаковы). Блок должен вернуть положительное число для индексов слева от того, которое вы ищете, отрицательное число для индексов справа от того, которое вы ищете, и 0 для индексов в пределах диапазона, который вы ищете. Ваш блок делает наоборот.
Он работает так, как он предназначен для работы - пожалуйста, прочитайте - http: // ruby-doc.org/core-2.2.0/Array.html # method-i-bsearch Пожалуйста, уточните, что вы пытаетесь достичь –
Я читал документ, но тест 'ary [i] - 1' должен возвращать 0, но он возвращает нуль. Я до сих пор этого не понимаю. – canoe
Какова цель вашего кода? Чего вы пытаетесь достичь? –