亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

Ruby編程中關于中斷和返回的用法教程

2020-02-24 15:37:22
字體:
來源:轉載
供稿:網友

return,break,next 的使用涉及到跳出范圍的問題,它們的區別在于跳出不同關鍵字的目的范圍不同,因為有些地方由于代碼塊而需要特別注意,今天武林技術頻道將和大家分享Ruby編程中關于中斷和返回的用法教程。
return
常用方式

通常情況下的return語句和大家理解的意思是相同的。

ruby.html="" tags="">ruby;">def m1 param if param == 1  return 'returned 1' end 'returned default value' # 根據Ruby語言規范,最后一條執行語句的結果將作為返回值返回,return是可選的endm1(1) # => returned 1m1(2) # => returned default value

在有異常捕獲的ensure時,情況會稍有不同:

def m1 'return default'ensure puts 'I am sure that it will be here!'endm1 # => return default

像這種情況,在ensure語句之前,無論是否顯示用return來返回,m1方法都會返回ensure之前的值, ensure語句只是確保之后的代碼塊puts 'I am sure that it will be here!'執行,但是不會從這里返回。 如果在ensure語句中顯示的用return來返回值時,情況就不一樣了。示例如下:

def m1 return 'return default'ensure return 'I am sure that it will be here!'endm1 # => I am sure that it will be here!

無論在ensure之前是否顯示返回,都只會返回ensure之后的值。

在有代碼塊干預的情況下,又會有所不同:

def m1 p 'start ... ' proc do  p 'block start'  return  p 'block end' end.call p 'end ... 'endm1# 輸出結果:## "start ... "# "block start"

這個應該是在預料之中的,再看下一個:

def m1 p 'start ... ' -> do  p 'block start'  return  p 'block end' end.call p 'end ... 'endm1# 輸出結果:## "start ... "# "block start"# "end ... "

這里多了一行"end ... ",原因何在?這就是Proc和Lambda最大的區別,在他們之中的return 語句跳出去的目的作用域不同,Proc會直接跳出整個方法的調用,而Lambda只會跳出自身的作用域, 返回到方法中繼續執行,這一點需要格外注意。(在break中,Proc和Lambda的跳出方式和return是一樣的,后面就不再贅述了。)
break

先來看一個簡單的小例子:

result = [1, 2, 3, 4, 5].map do |i| i * 2endp result # => [2, 4, 6, 8, 10]

這個沒什么奇怪的,那么看看下面這個,來猜猜它的輸出結果是什么?

result = [1, 2, 3, 4, 5].map do |i| break if i > 3 i * 2end# FLAGp result

是[1, 2, 3, nil, nil]?還是[1, 2, 3]?還是什么?答案是nil,因為執行break后,直接跳到了FLAG ,也就是跳出了map方法,而map方法中的語句并沒有執行完,導致沒有任何返回值,為了驗證這個想法是正確的,我們 可以利用Ruby語言的break可以帶返回值的特性來驗證一下:

result = [1, 2, 3, 4, 5].map do |i| break 'returned break' if i > 3 i * 2endp result # => "returned break"

這里可以證明我們的猜測是正確的。雖然上面說明了這個問題,但是應該還不是非常容易理解,我們自己定義 一個代碼塊,再來說明一下:

def m1 p 'start in m1 ... ' m2 do # 代碼塊  p 'start in block in m1 ... '  p 'end in block in m1 ... ' end p 'end in m1 ... 'enddef m2 &block p 'start in m2 ... ' block.call p 'end in m2 ... 'endm1# 輸出結果:## "start in m1 ... "# "start in m2 ... "# "start in block in m1 ... "# "end in block in m1 ... "# "end in m2 ... "# "end in m1 ... "

然后我們在m1中的block中添加break,來看看執行結果:

def m1 p 'start in m1 ... ' m2 do # 代碼塊  p 'start in block in m1 ... '  break  p 'end in block in m1 ... ' end p 'end in m1 ... 'enddef m2 &block p 'start in m2 ... ' block.call p 'end in m2 ... 'endm1# 輸出結果:## "start in m1 ... "# "start in m2 ... "# "start in block in m1 ... "# "end in m1 ... "

可以看到代碼塊的最后一行代碼沒有執行,m2的最后一行也沒有執行,就是因為這一行沒有執行,導致 break的第二個例子中的map沒有返回任何值??偨Y一下,代碼塊中的break會直接跳出調用的方法(m2), 而在聲明代碼塊的方法(m1)中繼續執行此方法(m1)中剩下的語句。
next

next關鍵字類似其他語言中的continue,它的工作方式基本和continue類似。

def m1 p 'start in m1 ... ' m2 do # 代碼塊  p 'start in block in m1 ... '  next  p 'end in block in m1 ... ' end p 'end in m1 ... 'enddef m2 &block p 'start in m2 ... ' block.call p 'end in m2 ... 'endm1# 輸出結果:## "start in m1 ... "# "start in m2 ... "# "start in block in m1 ... "# "end in m2 ... "# "end in m1 ... "

只是略過了代碼塊的最后一行代碼,這就是next的工作方式了。我們再來看看break的那個例子如果 用next來寫,看看結果是什么?如果你完全理解了上面所寫的,相信你已經能在大腦中計算出結果了:

result = [1, 2, 3, 4, 5].map do |i| next if i > 3 i * 2endp result # => [2, 4, 6, nil, nil]

next語句也能帶返回值:

result = [1, 2, 3, 4, 5].map do |i| next 'next' if i > 3 i * 2endp result # => [2, 4, 6, "next", "next"]

其他

對于return,在方法中,代碼塊中都可以使用,而break和next只能在代碼塊中使用(循環結構中 也可以使用,但是一般它也是用代碼塊的形式來表示),如果在方法中調用兩者會提示語法錯誤,也就是:

def m1 return # OK break # Invalid break, compile error (SyntaxError) next  # Invalid next, compile error (SyntaxError)end

結論

return 大部分情況下和其他語言無異,需要注意在ensure以及Proc和Lambda兩種不同的 代碼塊中的細節問題。

break 在有方法嵌套調用中的代碼塊中需要注意,它總是返回到調用代碼塊方法的方法中(有點繞)。

next 最老實,基本不需要注意什么。

最后就是,不只是return能返回值,break和next都能返回值。

上文是武林技術頻道介紹的Ruby編程中關于中斷和返回的用法教程,希望對你學習這方面知識有幫助,也希望大家繼續支持武林技術頻道!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人久久网| 亚洲精品视频在线观看视频| 亚洲综合大片69999| 欧美精品videofree1080p| 中文一区二区视频| 一本色道久久综合狠狠躁篇怎么玩| 亚洲精品福利在线| 色噜噜亚洲精品中文字幕| 色青青草原桃花久久综合| 高跟丝袜一区二区三区| 中文字幕亚洲色图| 日韩精品在线第一页| 亚洲第一网站免费视频| 国产女精品视频网站免费| 国产精品久久91| 色婷婷av一区二区三区久久| 亚洲www在线观看| 日韩av毛片网| 91精品中文在线| 亚洲国产精品va在线看黑人| 久久久999精品| 国产精品都在这里| 亚洲一级免费视频| 久久琪琪电影院| 欧美精品福利在线| 中文字幕亚洲激情| 亚洲欧美色图片| 91精品国产色综合| 国产成人在线精品| 中文.日本.精品| 欧美一级视频免费在线观看| 欧美性猛交丰臀xxxxx网站| 国产福利精品视频| 久久久久国产一区二区三区| 4438全国成人免费| 2018国产精品视频| 欧亚精品中文字幕| 亚洲网址你懂得| 97超级碰碰碰| 中文字幕亚洲一区在线观看| 亚洲精品国偷自产在线99热| 亚洲欧美中文另类| 亚洲缚视频在线观看| 精品亚洲一区二区三区| 亚洲成av人影院在线观看| 欧美亚洲国产另类| 国产一区二区丝袜| 亚洲精品国产精品国自产观看浪潮| 欧美日本精品在线| 亚洲欧美变态国产另类| 国产精品国模在线| 亚洲精品v欧美精品v日韩精品| 国产一区二区视频在线观看| 91高清在线免费观看| 国产情人节一区| 亚洲欧美色婷婷| 日韩午夜在线视频| 亚洲成人aaa| 亚洲毛片一区二区| 韩国一区二区电影| 国产精品日韩在线观看| 欧美黄色片视频| 亚洲第一区第一页| 国产精品视频内| 91九色国产在线| 精品精品国产国产自在线| 国产69精品久久久久9999| 97精品久久久中文字幕免费| 黄网站色欧美视频| 亚洲18私人小影院| 欧美日韩激情视频8区| 91网站在线看| 日韩欧美高清视频| www.99久久热国产日韩欧美.com| 欧美怡春院一区二区三区| 4p变态网欧美系列| 欧美日韩免费一区| 亚洲视频axxx| 欧美日韩国产色视频| 日韩风俗一区 二区| 国产精品久久久91| 色偷偷噜噜噜亚洲男人的天堂| 97免费视频在线播放| 亚洲精品日产aⅴ| 欧美高清视频在线观看| 亚洲福利视频久久| 中文精品99久久国产香蕉| 91精品一区二区| 在线精品视频视频中文字幕| 亚洲国产精品成人av| 亚洲精品久久久久| 一区二区三区视频观看| 午夜精品久久久99热福利| 日韩欧美在线播放| 精品久久久久久久久中文字幕| 久久精品国产v日韩v亚洲| 国产精品无码专区在线观看| 揄拍成人国产精品视频| 午夜伦理精品一区| 国产一区二区三区在线看| 欧美日韩一区二区在线播放| 亚洲www永久成人夜色| 色噜噜狠狠狠综合曰曰曰| 国产精品久久久久久久久久ktv| 日韩av男人的天堂| 久久久久久国产| 久久成人免费视频| 中文字幕欧美日韩在线| 日韩中文字幕在线视频播放| 最近2019好看的中文字幕免费| 欧美日韩成人网| 97精品伊人久久久大香线蕉| 亚洲综合色av| 欧美特黄级在线| 91精品久久久久久久久久另类| 国产亚洲精品久久久久久牛牛| 国产91露脸中文字幕在线| 亚洲视频在线观看免费| 日韩av电影国产| 狠狠久久五月精品中文字幕| 成人免费大片黄在线播放| 久久影院模特热| 亚洲国产免费av| 久久久久久伊人| 欧美日韩成人网| 97碰碰碰免费色视频| 国产精品国产三级国产aⅴ9色| 91国偷自产一区二区三区的观看方式| 国产欧美日韩精品专区| 欧美日韩免费区域视频在线观看| 亚洲自拍偷拍第一页| 亚洲深夜福利网站| 日韩av在线电影网| 欧美专区中文字幕| 18久久久久久| 综合国产在线视频| www日韩中文字幕在线看| 久久精品久久久久| 亚洲欧洲偷拍精品| 91免费综合在线| 国产精品视频一区二区高潮| 亚洲xxx视频| 成人久久久久久久| 中文字幕国产亚洲| 久久久久久久激情视频| 日本三级韩国三级久久| 日韩中文字幕不卡视频| 91免费综合在线| 国产成人一区二区三区电影| 国产精品久久久久国产a级| 热门国产精品亚洲第一区在线| 97在线免费视频| 欧美激情视频一区| 91日本在线观看| 亚洲福利影片在线| 欧美视频在线观看 亚洲欧| 亚洲精品久久久久| 欧美日韩国产中文字幕| 亚洲成人激情在线观看| 国产精品久久久久久久久男| 欧美日韩国产限制| 国产精品爽爽ⅴa在线观看| 久久99久国产精品黄毛片入口| 亚洲国产97在线精品一区|