为 ruby 使用 guard 转换 raise exception if else

Use guard for ruby convert raise exception if else

Rubocop 不断向我抛出错误:使用保护子句 (raise "no block" if not block_given?) 而不是将代码包装在条件表达式中。

# frozen_string_literal: true

def bubble_sort_by(arr)
    if block_given?
        swap = -1
        while swap != 0
            swap = 0
            (0..(arr.length - 2)).each do |i|
                if yield(arr[i], arr[i + 1]).positive?
                    arr[i], arr[i + 1] = arr[i + 1], arr[i]
                    swap += 1
                end
            end
        end
    else
        raise "no block"
    end
    arr
end

#given test
bubble_sort_by(["hey", "hello", "hi"]) {|left, right| left.length - right.length
}

试过 unless 但还是一样,我不明白我应该如何转换为 guard 子句。

如果你用 if-else 包裹整个方法体而 else 只包裹引发错误,你可以重构为:

def bubble_sort_by(arr)
  raise "no block" unless block_given?
  swap = -1
  while swap != 0
    swap = 0
    (0..(arr.length - 2)).each do |i|
      if yield(arr[i], arr[i + 1]).positive?
        arr[i], arr[i + 1] = arr[i + 1], arr[i]
        swap += 1
      end
    end
  end
  arr
end

你有一个条件在上面,方法的主要部分在它之后。