【问题标题】:Explicit "return" inside control structures and blocks in IRB gives "unexpected return"IRB 中控制结构和块内的显式“返回”给出“意外返回”
【发布时间】:2012-11-11 20:16:13
【问题描述】:

关于以下代码:

if a == 1
  return "a is one"
end

当我在 IRB 中执行它时,它给了我

LocalJumpError:意外return

但是当我将相同的代码放入我的 Rails 应用程序时,它运行完美。

我真的必须避免从块内部返回显式值吗?为什么 Rails 应用程序没有问题?

【问题讨论】:

    标签: ruby irb


    【解决方案1】:

    当您在控制台中单独运行此代码时,没有可返回的范围。只要将其放入方法中,它就会按预期工作。

    没有范围的例子:

    irb(main):001:0> if a = 1
    irb(main):002:1>   return "a is one"
    irb(main):003:1> end
    LocalJumpError: unexpected return
      from (irb):2
      from /Users/dougal/.rbenv/versions/1.9.3-p194/bin/irb:12:in `<main>'
    

    在方法中作用域的示例:

    irb(main):001:0> def run
    irb(main):002:1> if a = 1
    irb(main):003:2>   return "a is one"
    irb(main):004:2> end
    irb(main):005:1> end
    => nil
    irb(main):006:0> puts run
    a is one
    => nil
    

    【讨论】:

      【解决方案2】:

      要记住一个微妙之处:通过lambda 创建的块的行为类似于方法 - 它们的内部return 只是终止块本身,但return 上的通用块终止各自的方法

      def generic_block_demo
        (10..15).each {|el| return el }
        puts "You'll never be here"
      end
      
      def lambda_block_demo
        (10..15).each &lambda{|el| return el }
        puts "You'll be here! I know!"
        12345
      end
      
      puts generic_block_demo # => 10
      
      puts lambda_block_demo # => You'll be here! I know!
                             #    12345
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-23
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多