Вызов частного метода

Я реализовал алгоритм подсчета инверсий массива (который также объединяет массив), но для того, чтобы сделать его более аккуратным, я хочу провести сортировку и подсчет выходных данных.

Метод *count_and_sort* возвращает массив [ number_of_inversions, [sorted_array] ]. Методы инверсии и *merge_sort* должны возвращать number_of_inversions и [sorted_array] отдельно, но вместо этого я получаю NoMethodError

Что я упустил?


class Array

    def inversions
        count_and_sort[0]
    end

    def merge_sort
        count_and_sort[1]
    end

    def merge_sort!
        replace merge_sort
    end

private

    def count_and_sort
        return [0, self] if self.size <= 1
        left, right = partition.with_index{ |value, index| index < self.size / 2}
        left = left.count_and_sort
        right = right.count_and_sort
        merged = merge(left[1], right[1])

        [left[0] + right[0] + merged[0], merged[1]]
    end

    def merge(left, right)
        inversions = 0
        merged = []
        until left.empty? || right.empty?
            if left.first < right.first
                merged << left.shift
            else
                merged << right.shift
                inversions += left.size
            end
        end

        merged += left += right
        [inversions, merged]
    end
end

p [*1..20].shuffle.inversions

Я пытался заменить инверсии на

def inversions
    result = self.send(:count_and_sort)
    result[0]
end

но результат был тот же.

PS любая другая критика и комментарии приветствуются;)

1 ответ

Решение

Ошибка внутри count_and_sort метод, как говорится в сообщении об ошибке:

... in 'count_and_sort': private method 'count_and_sort' called for ...

Неправильные строки:

left = left.count_and_sort
right = right.count_and_sort

Закрытые методы в Ruby нельзя вызывать с явным получателем, они должны вызываться неявно self, Таким образом, вы можете сделать count_and_sort метод защищен или вызовите его send на left а также right, В этом случае я бы предложил первое.

Другие вопросы по тегам