【问题标题】:How Yield statement in ruby works?ruby 中的 Yield 声明如何工作?
【发布时间】:2019-04-27 01:35:31
【问题描述】:

有人可以说明如何正确格式化此收益声明,为什么我的收益声明方法不正确?运行时,编译器会导致“未定义方法'length'错误。“测试”是主类。

  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

【问题讨论】:

  • 如果块是 { |a,b| a*b }c = yield(2,3)ab 将分别被分配值 23,因此块将返回 6,这将被分配给变量c
  • 感谢您的回复,卡里。 @CarySwoveland " if yield(array[i-1], array[i]) > 1" 与上面为 if 语句编写的代码有何不同。
  • 不,块的主体 (left.length - right.length) 只能访问由 yield 直接传递给它的变量,不能访问在执行屈服(bubble_sort_by)。

标签: ruby-on-rails ruby yield


【解决方案1】:

因为您需要将参数传递给 yield。

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

【讨论】:

    【解决方案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 保存。

    【讨论】:

    • 一个小建议:最好也解释一下您所做的更改以及需要更改的原因。
    • @Rada,这是一个很好的观点。我没有详细说明的唯一原因是因为我之前在对该问题的评论中留下了简短的解释。但你是对的;我将编辑我的答案。
    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2014-03-11
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多