Как работает заявление доходности в рубине? - PullRequest
0 голосов
/ 25 ноября 2018

Может кто-нибудь показать, как правильно отформатировать этот оператор доходности, и почему моя методология для этого оператора доходности неверна?При запуске компилятор выдает ошибку «длина неопределенного метода». «Test» является основным классом.

  def bubble_sort_by(array)
    len = array.length - 1
    while len > 0
      for i in(1..len)
        @left = array[i]
        @right = array[i - 1]
        yield
        if @left - @right > 0
           array[i - 1], array[i] = array[i], array[i - 1]
        end
      end
      len -= 1
    end
   p array
end

  Test.bubble_sort_by(%w[hi hello hey]) do |left, right|
    left.length - right.length
  end

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Как я уже сказал в своем комментарии к вопросу, yield необходимо передать значения для переменных блока.Поэтому ваш код необходимо изменить следующим образом.

def bubble_sort_by(array)
    len = array.length - 1
    while len > 0
      for i in(1..len)
        @left = array[i]
        @right = array[i - 1]
        if yield(@left, @right) > 0
          array[i - 1], array[i] = array[i], array[i - 1]
        end
      end
      len -= 1
    end
  array
end

bubble_sort_by(%w[hi hello hey]) do |left, right|
  left.length - right.length
end
  #=> ["hello", "hey", "hi"]

Если, как и здесь, блок, в который передается блок, имеет переменные блока, значения этих переменных должны быть переданы как аргументы yield.Значение, вычисленное блоком, затем возвращается, как если бы yield был вызовом метода.

Если вы предпочитаете, вы можете заменить первую строку на

def bubble_sort_by(array, &block)

и заменить if yield(@left, @right) > 0 с

if block.call(@left, @right) > 0

Здесь & преобразует блок в Proc, который содержится в переменной block.

0 голосов
/ 25 ноября 2018

потому что вам нужно передать аргументы для yield.

попытаться изменить строку с доходностью на: compared = yield @left, @right и обработать результат compared

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...