Project1

标题: 如何按任意键跳过一段含有多个循环的程序 [打印本页]

作者: 天使怪盗    时间: 2011-3-7 16:16
标题: 如何按任意键跳过一段含有多个循环的程序
本帖最后由 天使怪盗 于 2011-3-8 23:22 编辑

看标题可能不太明白、其实是目前一段程序显示图片用了多个loop do、中间使用的是if Input.trigger?(Input::C) break、想实现在任意一个loop do中按了任意键就忽略之后所有的程序直接转到其它场景如Scene_title、但是只按任意键的话似乎只能中断当前循环、仍然会进行下一段循环、各位大虾求助
作者: 魔能奶糖猫    时间: 2011-3-7 16:19
回复 天使怪盗 的帖子

按键之后使某个变量改变,然后再每个循环里判断并break,RUBY可不像C可以直接跳出来。
作者: 沙漠点灰    时间: 2011-3-7 17:24
回复 天使怪盗 的帖子

表示可以把“循环的地方”抽出来,建一个方法调用它,需要退出循环时,return就好了
作者: 匿名    时间: 2011-3-7 17:50
本帖最后由 匿名 于 2011-3-7 17:51 编辑


C的年代,我们直接GOTO
RUBY的年代,我们catch/throw (直接丢个异常,我们就出去了,回头捕获一下)

吐槽:GOTO其实是神器,可惜一群不会用的小白吐槽它会搞坏代码……
作者: 后知后觉    时间: 2011-3-7 17:50
def abc
loop do
xxxxx
return if 按了某键
end # loop do 的end
loop do xxxxx
return if 按了某键
end # loop do 的end
end # def abc 的 end

调用 abc即可
作者: 禾西    时间: 2011-3-8 09:50
其實幫助中有:
catch(tag) {|tag| .... }
运行块并返回它的值。若在块的运行过程中,遇到与 tag 同名的 throw 的话,将把 throw 的第二参数的值作为返回值。

嵌套的循环不会因为遇到 break 就一下子跳出。这时可使用 catch。

catch(:loop1) {
  for i in 1..2
    for j in 1..2
      throw :loop1, j
    end
  end
}

作者: 苏小脉    时间: 2011-3-10 07:41
Anonymous 发表于 2011-3-7 17:50
C的年代,我们直接GOTO
RUBY的年代,我们catch/throw (直接丢个异常,我们就出去了,回头捕获 ...

goto 在如今结构化编程的趋势下已经淡出很久了……
汇编层的跳转那真能算神器,C 层的 goto 只能局部跳转,和  setjmp/longjmp 小巫见大巫啊。

@楼主:
楼上各位说了不少,都是可行的,请你先测试一下再说。这里我再给出另一个方法——利用 Continuation 在 Ruby 层直接进行栈帧的跳转:
callcc do |cont|
  loop do
    loop do
      loop do
        # ...
        # 跳转到最外层
        cont.call
      end
    end
  end
end

p '跳出了所有循环'

另:Ruby 1.9 中 Continuation 只有再包含了其对应的标准库时才能使用。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1