【问题标题】:How do I use `yield`?如何使用“收益”?
【发布时间】:2018-01-05 17:53:38
【问题描述】:

我有一个清单:

list = ["mango", "apple", "pearl", "peach"]

而我需要使用yield 这样这行代码:

answer = myIndexOf(list) {|e| e == "apple"}

返回值1,即"apple"在数组中的索引。

我有这个,但我不明白yield

def myIndexOf(list)  
  yield answer if block_given?  
  result = list.index(answer)  
  return answer  
end  

有人能解释一下吗?

【问题讨论】:

  • 是的,我根本没有收益。所有的例子都没有任何意义。
  • yield 表示“将控制权交给区块。 yield(e)yield e 表示将控制权交给将 e 传递给块变量的块。在英语中,“yield”可以表示“放弃”或“移交”。所以如果你让出控制权,你就交出控制权。在编程中具有相同的含义。继续努力吧。我认为上面的问题有点棘手,但是按照 Sergio 的建议,它可能会点击。
  • 方法体中的局部变量answer是什么?
  • Blocks and yields in Ruby的可能重复

标签: ruby yield


【解决方案1】:

Sergio 的进一步回答:

list = ["mango", "apple", "pearl", "peach"]

def myIndexOf(a_list)
  a_list.index { |e| yield e }
end

p answer = myIndexOf(list) { |e| e ==  'apple' }
#=> 1

我提交是因为我认为这是一个棘手的练习,逆向工程的答案可能会对你有所帮助。

【讨论】:

    【解决方案2】:

    yield 调用该块。

    以下功能“相同”

    def example()
      raise unless block_given?
      yield 1
      yield 2
      yield 3
    end
    
    def example(&block)
      block.call(1)
      block.call(2)
      block.call(3)
    end
    

    两者都可以如下调用

    example { |each| puts each }
    

    然后两者都会输出

    1
    2
    3
    

    希望这有助于阐明 Ruby 中的高阶函数。

    【讨论】:

      【解决方案3】:

      理解 yield/blocks 实际上很简单。只需将块视为方法,将 yield 视为调用这些方法的一种方式。

      想象一下,你有这个,而不是阻塞

      def is_this_the_right_item?(item)
        item == "apple"
      end
      
      def myIndexOf(a_list)
        # your implementation goes here
      end
      
      answer = myIndexOf(list)
      

      你能这个实现myIndexOf吗?它根本不涉及屈服。完成后,您只需将块带回到对myIndexOf 的调用,并将所有对is_this_the_right_item? 的调用替换为yield

      【讨论】:

      • 显然,我可以只粘贴固定代码。但是其中的学习点在哪里?
      • 是的,我还是不明白。
      • @fwefwf 你有没有按照我的提示实现myIndexOf的替代实现?
      • 不,你怎么做对我来说没有任何意义 myIndexOf 只接受列表,但用户没有提供他想要的元素我不知道如何提取因为在其他语言中,它的 jsut 给出了。
      • @fwefwf: is_this_the_right_item? 方法知道用户想要哪个元素。你传给它一个元素,它返回真或假。 myIndexOf 应该使用该方法来确定要返回的元素。哦,不要使用a_list.index()。您正在尝试重新实现index,不是吗?所以使用原始实现有点违背了目的。
      猜你喜欢
      • 2020-11-20
      • 2011-01-13
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多