红宝石中的收益率声明如何工作?

时间:2018-11-25 00:26:13

标签: ruby-on-rails ruby yield

有人可以显示如何正确格式化此yield语句,以及为什么我的此yield语句的方法不正确吗?

运行时,编译器将导致“未定义的方法'length'错误。“ 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 :(得分:2)

因为您需要传递参数来产生。

尝试将带有yield的行更改为: compared = yield @left, @right 并处理compared的结果

答案 1 :(得分:2)

正如我在对该问题的评论中所说,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保存。

相关问题