Блок Ruby работает с {}, но не с do ... end - PullRequest
0 голосов
/ 28 декабря 2018

Я пытался реализовать метод пузырьковой сортировки, который принимает блок и возвращает массив, отсортированный в порядке возрастания.По какой-то причине, которую я не могу понять, я получаю правильный результат, когда использую {}, но я получаю ошибку «блок не указан», когда я использую do ... end.

Вот код:

def bubble_sort_by(arr)
  return arr if arr.size == 1
  swapped = true

  while swapped
    swapped = false
    (0...arr.size - 1).each do |index|
      block_result = yield(arr[index], arr[index + 1])
      # binding.pry
      if block_result >= 1
        arr[index], arr[index + 1] = arr[index + 1], arr[index]
        swapped = true
        # binding.pry
      end
    end
  end
  arr
end

p bubble_sort_by(["hi","hello","heys"]) do |left,right|
left.length - right.length 
end
#the code returns ["hi", "heys", "hello"] when the block is passed with { }

Любая помощь будет наиболее ценной.

1 Ответ

0 голосов
/ 28 декабря 2018

Приоритет имеет значение.

{} имеет почти самый верхний приоритет и выполняется перед приложением функции (до p() вызова.)

do end OTOH имеет почти самый низкий приоритет и выполняется после приложения функции (после p() вызова.)

Поставьте скобки, чтобы избежать неоднозначности:

p(bubble_sort_by(["hi","hello","heys"]) do |left,right|
  left.length - right.length 
end)

В исходном примере порядок выполнения был следующим:

p(bubble_sort_by(["hi","hello","heys"])) do ... end

Обычно вы вызывали p с параметром и блок.

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