Как я уже сказал в своем комментарии к вопросу, 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
.