新手问题 方法中有块,块中有 break 和 next,这种情况应该怎么理解?

dggy · April 11, 2018 · Last by dggy replied at April 15, 2018 · 1601 hits

准备放弃 java 转 ruby(大四),目前在学习语言基础,对 break 和 next 在这种情况下(下面两段代码)的理解,有点不自信,请大佬们指点一下!感谢!感谢!

def total (from , to)
    result=0
    from.upto(to) do |num|
        result+=yield(num)
    end
    return result
end

n=total(1,10) do|num|
    if num==5
        break 1 
    end
    num
end
p n # => 1
def total (from , to)
    result=0
    from.upto(to) do |num|
        result+=yield(num)
    end
    return result
end

n=total(1,10) do|num|
    if num==5
        next 1 # 这两端代码只有这个地方不一样
    end
    num
end
p n # =>51

我的理解是:

  • break在块中,会结束块所在方法(total 方法)的执行,也就是说遇到 break,块所在的方法执行被中断,方法直接返回 break 后面的值(没有则为 nil);
  • next是结束块的执行,也就是说遇到 next,块执行被中断,方法调用块的地方接收 next 后面的值(没有则为 nill)。 不知道这样理解是不是正确的呢。


20180415 更,感谢各位大佬

这次把“break 会结束方法的执行”改成了“break 会结束块所在方法的执行”

# ``` ruby
# 这样可以加代码高亮
# ```

puts 'hello'
Reply to lithium4010

感谢

puts '试一下'

不对,break 是结束循环,return 才是结束方法。 “break 1”的意思就是,结束循环,并且这个循环的返回值为 1 “return 1”的意思就是,结束方法,并且这个方法的返回值为 1

Reply to UlyssesZhan

感谢 ……没明白,那上面的代码为什么会输出 1,而不是 11?

如果用 lambda 的方式来理解迭代中的块,那 break 的存在就有点奇怪了,forEach 中的 lambda 怎么有能力中止整个 forEach 的执行呢?

Reply to UlyssesZhan

他说的方法是 total 方法,在这个代码上下文确实是会结束 total 方法的。

Reply to UlyssesZhan

你在这个 block 里面用 return 应该是会报错的

8 Floor has deleted

帖子可以修改,麻烦加上高亮

Reply to lithium4010

在 block 中用 return 确实会报错,但是 break 也不可以简单地认为结束方法的执行,如果我们在方法内部循环之后再加一行代码的话,新加的代码也会被执行

Reply to lithium4010

是的大佬,加 return 确实会报错(unexpected return (LocalJumpError)) 加上了高亮了!大佬,之前不知道还有高亮这一说。

Reply to UlyssesZhan

不知你说的哪种情况,可以放下代码吗?

def total (from , to)
    result=0
    from.upto(to) do |num|
        result+=yield(num)
    puts num # =>1, 2 ,3, 4  后面直接是下面的  1  了
    end
    return result
end

n=total(1,10) do|num|
    if num==5
        break 1 
    end
    num
end
p n # => 1
dggy closed this topic. 16 Apr 13:51
You need to Sign in before reply, if you don't have an account, please Sign up first.