【问题标题】:What does 'yield called out of block' mean in Ruby?在 Ruby 中,'yield call out of block' 是什么意思?
【发布时间】:2010-09-12 06:19:24
【问题描述】:

我是 Ruby 新手,我正在尝试以下方法:

mySet = numOfCuts.times.map{ rand(seqLength) }

但我得到了“块外调用的产量”错误。我不确定他的意思。顺便说一句,这个问题是我问过的一个更一般的问题的一部分 here

【问题讨论】:

  • 你用的是jruby还是mri ruby​​?

标签: ruby functional-programming


【解决方案1】:

Integer.times 需要一个块。错误信息意味着times方法中的yield语句不能被调用,因为你没有给它一个块。

至于您的代码,我认为您正在寻找的是一个范围:

(1..5).map{ do something }

这是Integer.timesRange 的rubydoc。

【讨论】:

    【解决方案2】:

    Bingo,我刚刚发现这是什么。它是一个 JRuby 错误。

    在核磁共振下

    >> 3.times.map
    => [0, 1, 2]
    >> 
    

    在 JRuby 下

    irb(main):001:0> 3.times.map
    LocalJumpError: yield called out of block
        from (irb):2:in `times'
        from (irb):2:in `signal_status'
    irb(main):002:0> 
    

    现在,我不知道 MRI(标准 Ruby 实现)是否在这里做正确的事情。它可能应该抱怨这没有意义,但是当在 MRI 中调用 n.times 时,它会返回一个 Enumerator,而 Jruby 抱怨它需要一个块。

    【讨论】:

      【解决方案3】:

      问题在于,times 方法期望得到一个块,它将让出控制权。但是,您还没有向它传递一个块。有两种方法可以解决这个问题。首先是不使用时间:

      mySet = (1..numOfCuts).map{ rand(seqLength) }
      

      或者传递一个块给它:

      mySet = []
      numOfCuts.times {mySet.push( rand(seqLength) )}
      

      【讨论】:

      • 你想要一个 ) 在 numOfCuts 之后 :) (并且会有重复)
      • 糟糕,已修复。我只是想修复 API 错误,而不是逻辑错误。
      • Ruby 中的块到底是什么?
      • 我认为我无法比rubycentral.com/book/tut_containers.html(Ruby 编程的一章)中更好地解释块。
      【解决方案4】:

      您正在组合似乎没有意义的函数 - 如果 numOfCuts 是一个整数,那么只使用时间和一个块将运行该块多次(尽管它只返回原始整数:

      irb(main):089:0> 2.times {|x| puts x}
      0
      1
      2
      

      map 是一个作用于范围和数组并返回数组的函数:

      irb(main):092:0> (1..3).map { |x| puts x; x+1 }
      1
      2
      3
      [2, 3, 4]
      

      我不确定你想用代码实现什么 - 你想做什么? (而不是专门询问似乎无效的语法)

      【讨论】:

        【解决方案5】:

        如果“numOfCuts”是一个整数,

        5.times.foo   
        

        无效

        "times" 需要一个块。

        5.times{   code here   } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-31
          • 1970-01-01
          • 2020-06-28
          • 2016-08-17
          • 1970-01-01
          • 2021-08-03
          • 2020-12-19
          相关资源
          最近更新 更多