国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > 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的常用方式,武林技術頻道將整理更多的技術知識,才能受到諸多學者的歡迎。

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

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产一级二级三级在线观看| 国产精品毛片一区二区三区四区| 国产黄在线看| 国产黄色免费网站| www.狠狠艹| 九九热在线观看视频| 尤物视频在线观看| 在线欧美一级视频| 国产免费视频| 国产馆av播放| 香蕉视频在线看| 日本18视频网站| 国产视频二区在线观看| 国产高清视频在线| 国产精品入口麻豆高清| 香蕉视频网站在线观看| 99热在线观看免费| sm国产在线调教视频| 国产黄在线播放| 欧美性猛交p30| 国产福利三区| 国产真实伦在线观看| 亚洲精品久久久成人| 中文字幕在线资源| 黄网址在线永久免费观看| av大片在线播放| 国产亚洲精品自在线观看| www免费在线观看| 97视频在线| 丁香视频免费观看| 国产在线黄色片| www.eeuss影院| 91午夜视频| 7777在线| 国产福利免费在线观看| 尤物网在线观看| 懂色一区二区三区| 男人操女人免费网站| av片在线观看永久免费| 精品成人一区二区三区免费视频| 国产精品免费91| 国产亚av手机在线观看| 88av在线| 天堂在线中文资源| 成人亚洲一区二区三区| 午夜国产在线| 国产视频二区三区| 国产一二三区在线视频| 国产视频青青| 国产日本在线视频| 国产超碰97| 永久免费av网站| 秋霞av在线| 国产原创av在线| 国产午夜在线| 97影院理论午夜| 亚洲免费网站在线观看| а√最新版在线天堂| 九九热精品在线视频| 黄色毛片在线| 国产一级二级在线| 精品伦理一区二区| 免费午夜一级| 国产精品777一区二区| 99在线播放| 黄色毛片在线观看| 国产三级自拍| 亚洲91av| 国产网站麻豆精品视频| 92国产在线视频| 国产免费黄视频在线观看| 精品一区二区三区在线观看l| 四虎免费播放| 国产精品国精产品一二| 精品卡一卡卡2卡3网站| 非洲黑人最猛性xxxx交| 亚洲日本伊人| 国产精品免费视频一区一| 热99re久久精品这里都是免费| 国产美女在线播放| 亚洲久草视频| 国产高清视频在线播放| 九色精品视频在线观看| 永久免费网站在线| 国产色a在线| 国产中文在线观看| 超碰97在线免费观看| 精品黄色免费中文电影在线播放 | a视频在线观看免费| √天堂8资源中文在线| 日本视频在线观看一区二区三区| 国产叼嘿网站免费观看不用充会员| 欧美性猛交xxxx免费看蜜桃| av福利在线观看| 国产成人亚洲欧美电影| 国产精品你懂的在线观看| 狠狠干天天爱| 黄色av网站在线| а√最新版地址在线天堂| 天堂网中文在线| 亚洲а∨精品天堂在线| 午夜小视频在线| 国产日产精品久久久久久婷婷| 九九热免费视频| 久久一本精品| 国产一区二区三区不卡免费观看| 国产免费a∨片在线观看不卡| 国产在线拍揄自揄拍视频| 国产另类图片| 国产精品久久久久久精| 在线国产1区| 麻豆精品视频入口| 国产一二三在线观看| 国产黄色高清在线| 亚洲综合在线不卡| 国产中文字幕av| 国产日本视频| 国产传媒在线播放| 亚洲人成影院在线| 激情小说 在线视频| 国产亚洲精品久久久久久青梅| 国产一二三区在线观看| 精品国产一区二区三区不卡在线| 亚洲欧美中文字幕在线观看 | 久久99精品久久久久久野外| 中文字幕在线视频不卡| 伊人av免费在线观看| 黄网在线免费| 国产对白叫床清晰在线播放| 在线国产中文字幕| 五月婷婷开心综合| 午夜影院免费| 91资源在线观看| 天天操人人爽| eeuss影影院www在线播放| 中中文字幕av在线| 亚洲视频手机在线观看| 天堂中文在线视频| 日本在线观看网站| 国产成人精品实拍在线| 国产免费永久在线观看| 亚洲精品aaaa| 精品国产一区二区三区不卡在线 | 欧洲一区av| 精品伦理一区二区| 国产三级在线观看| 高清av中文在线字幕观看1| 精品街拍一区二区| 国产理论电影在线| 九九免费视频| 日本黄色免费网址| 一二三四区在线观看| 精品麻豆一区二区三区| 国产精品入口麻豆免费看| 激情视频国产| 九九热视频免费在线观看| 伊人网站在线| 精品视频二区| 91免费日韩| 国产成人精品久久一区二区小说 | 国产95在线|亚洲| 国产精品久久人| 国产区视频在线观看| 国产尤物视频| 国产一起色一起爱| 国产xxx在线| 四虎网站在线观看| 久久精品无码一区二区日韩av| av在线免费播放网站| 青青草中文字幕| 九九在线免费视频| 国产麻豆免费| 国产一二三四| 7777在线| 欧美亚洲天堂| 午夜视频免费在线观看| 国产娇喘精品一区二区三区图片| 国产福利电影在线| 日本免费黄色| 国产在线中文字幕| 国产一级二级在线| 亚洲欧美综合乱码精品成人网| 欧美性受xxxx免费视频| 欧美日韩国产亚洲沙发| 国产理论片免费观看| 国产福利在线视频| 青草视频在线播放| 国产亚洲精品拍拍拍拍拍| 一本大道久久a久久精品| 欧美韩日国产| 18成年在线观看| 超碰免费在线播放| 国产成人亚洲欧美电影| 热99在线观看| 国产精品免费视频二三区| 午夜在线观看91| 国产精品美女一区二区视频| а√天堂www在线а√天堂视频| 国产原创av在线| eeuss影院在线观看|