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

首頁 > 編程 > Ruby > 正文

詳解Ruby中的return、break、next的常用方式

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

Ruby中的block有廣泛的用途和強大的功能,在程序中可以使用三種特殊操作方法,今天武林技術頻道小編將詳解Ruby中的return、break、next的常用方式,希望對你有幫助!

return

常用方式

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

復制代碼 代碼如下:

def m1 param
? if param == 1
??? return 'returned 1'
? end
'returned default value'#根據Ruby語言規范,最后一條執行語句的結果將作為返回值返回,retu rn是可???? 選的
end

?

m1(1) # => returned 1
m1(2) # => returned default value


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

?

復制代碼 代碼如下:

?


def m1
? 'return default'
ensure
? puts 'I am sure that it will be here!'
end

?

m1 # => 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!'
end

?

m1 # => 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 ... '
end

?

m1

# 輸出結果:
#
# "start ... "
# "block start"


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

?

復制代碼 代碼如下:

?


def m1
? p 'start ... '
? -> do
??? p 'block start'
?? return
?? p 'block end'
? end.call
? p 'end ... '
end

?

m1

# 輸出結果:
#
# "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 * 2
end

?

p result # => [2, 4, 6, 8, 10]


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

?

復制代碼 代碼如下:

?


result = [1, 2, 3, 4, 5].map do |i|
? break if i > 3
? i * 2
end
# FLAG
p 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 * 2
end

?

p 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 ... '
end

?

def m2 &block
? p 'start in m2 ... '
? block.call
? p 'end in m2 ... '
end

m1

# 輸出結果:
#
# "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 ... '
end

?

def m2 &block
? p 'start in m2 ... '
? block.call
? p 'end in m2 ... '
end

m1

# 輸出結果:
#
# "start in m1 ... "
# "start in m2 ... "
# "start in block in m1 ... "
# "end in m1 ... "

?

可以看到代碼塊的最后一行代碼沒有執行,m2的最后一行也沒有執行,就是因為這一行沒有執行,導致 break的第二個例子中的map沒有返回任何值。總結一下,代碼塊中的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 ... '
end

?

def m2 &block
? p 'start in m2 ... '
?block.call
? p 'end in m2 ... '
end

m1

# 輸出結果:
#
# "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 * 2
end

?

p result # => [2, 4, 6, nil, nil]


next語句也能帶返回值: ``` result = [1, 2, 3, 4, 5].map do |i| next 'next' if i > 3 i * 2 end

?

復制代碼 代碼如下:

?


p 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

看了以上的介紹,相信大家已經明白了詳解Ruby中的return、break、next的常用方式,武林技術頻道將整理更多的技術知識,才能受到諸多學者的歡迎。

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产乱码久久久久久婷婷| 日韩精品在线观看网站| 亚洲午夜精品久久久久久久久久久久| 国产丝袜一区二区三区免费视频| 另类少妇人与禽zozz0性伦| 欧美巨大黑人极品精男| 4438全国亚洲精品在线观看视频| 欧美精品videossex性护士| 色综合久久88色综合天天看泰| 欧美成人午夜影院| 国产91精品黑色丝袜高跟鞋| 美乳少妇欧美精品| 中文字幕av日韩| 亚洲精品中文字| 国产亚洲精品久久久久久牛牛| 欧美小视频在线| 欧美极品美女电影一区| 91国产视频在线| 亚洲成人久久一区| 91中文在线视频| 国产成人97精品免费看片| 91最新国产视频| 欧美成人合集magnet| 深夜成人在线观看| 97久久久免费福利网址| 国产91色在线播放| 亚洲国产成人在线播放| 欧美激情精品久久久久| 福利二区91精品bt7086| 成人黄色av免费在线观看| 国产日韩在线精品av| 欧美黑人狂野猛交老妇| 中文字幕国产精品久久| 欧美日韩免费观看中文| 亚洲第一区第二区| 亚洲图片欧洲图片av| 日韩av在线免费看| 国语自产精品视频在免费| 亚洲欧美日韩中文在线制服| 精品一区二区三区四区在线| 自拍偷拍亚洲欧美| 国产亚洲精品美女| 久久国产视频网站| 91欧美视频网站| 日韩不卡在线观看| 久久精品亚洲一区| 九九热这里只有精品6| 日韩日本欧美亚洲| 精品动漫一区二区三区| 最新国产精品拍自在线播放| 亚洲自拍小视频| 成人精品在线视频| 精品国产美女在线| 久久精品视频导航| 成人网址在线观看| 亚洲码在线观看| 亚洲白虎美女被爆操| 色综合久久88色综合天天看泰| 久久久精品免费| 精品成人在线视频| 国产精品稀缺呦系列在线| 国产综合香蕉五月婷在线| 国产精品自产拍在线观| 成人亲热视频网站| 青青久久av北条麻妃海外网| 中文字幕欧美国内| 91久久精品视频| 成人av电影天堂| 91精品中文在线| 韩日精品中文字幕| 精品国产乱码久久久久酒店| 欧美日韩福利视频| 国产亚洲欧洲高清一区| 久久久欧美一区二区| 久久人人看视频| 国产精品欧美久久久| 欧美精品久久久久久久| 色诱女教师一区二区三区| 欧美一区二区视频97| 欧美小视频在线| 亚洲国产精品资源| 一区二区三区www| 亚洲欧美日本伦理| 久久久久国产一区二区三区| 91免费看片在线| 久久综合伊人77777尤物| 久久视频中文字幕| 国产成人一区二区在线| 久久久久国产视频| 91久久精品视频| 91国自产精品中文字幕亚洲| 久久久爽爽爽美女图片| 精品一区二区三区电影| 一区二区欧美激情| 国产亚洲日本欧美韩国| 中文字幕在线观看亚洲| 欧美亚洲激情视频| 亚洲国产高清福利视频| 日韩视频免费观看| 国产精品99久久久久久www| 美女久久久久久久| 中文字幕欧美日韩va免费视频| 国产91精品黑色丝袜高跟鞋| 欧美亚洲成人网| 国产精品专区h在线观看| 亚洲天堂男人的天堂| 亚洲丁香久久久| 亚洲色图偷窥自拍| 亚洲国内精品在线| 亚洲美女在线看| 久久久久久久久久婷婷| 亚洲欧美在线免费观看| 欧美一区二区三区四区在线| 亚洲精品第一国产综合精品| 欧美日韩激情小视频| 国产精品久久久久一区二区| 亚洲国产成人在线播放| 国产精品7m视频| 欧美日韩国产色视频| 欧美日韩亚洲天堂| 91牛牛免费视频| 欧美资源在线观看| 久热99视频在线观看| 欧美激情区在线播放| 亚洲男人第一网站| 国产精品久久久久久久久久东京| 国产精品揄拍500视频| 91香蕉嫩草神马影院在线观看| 欧美午夜片欧美片在线观看| 成年人精品视频| 国产福利视频一区| 亚洲欧美国产精品va在线观看| 色久欧美在线视频观看| 国产精品久久久久久久久久久久久久| 欧美性猛交xxxx富婆弯腰| 亚洲国产日韩欧美在线动漫| 亚洲国产精品久久久久| 日韩精品极品视频免费观看| 国内精品小视频| 亚洲天堂av网| 琪琪亚洲精品午夜在线| 操91在线视频| 亚洲欧美成人一区二区在线电影| 久久久亚洲国产| 久久视频在线看| 久久影视电视剧免费网站清宫辞电视| 欧美亚洲国产视频| 久久精品国产成人精品| 中文字幕久久久| 538国产精品一区二区在线| 日韩精品中文字幕有码专区| 深夜福利国产精品| 亚洲欧美综合区自拍另类| 亚洲电影在线看| 亚洲精品视频网上网址在线观看| 国产成人涩涩涩视频在线观看| 欧美黄色免费网站| 亚洲日韩欧美视频一区| 国产这里只有精品| 国产精品美女久久| 亚洲国产精品久久精品怡红院| 最近免费中文字幕视频2019| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品96久久久久久又黄又硬|