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

dggy · 2018年04月11日 · 最后由 dggy 回复于 2018年04月15日 · 1510 次阅读

准备放弃 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'
lithium4010 回复

感谢

puts '试一下'

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

UlyssesZhan 回复

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

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

UlyssesZhan 回复

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

UlyssesZhan 回复

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

8 楼 已删除

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

lithium4010 回复

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

lithium4010 回复

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

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 关闭了讨论。 04月16日 13:51
需要 登录 后方可回复, 如果你还没有账号请 注册新账号