国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Ruby中的return、break、next詳解

2019-10-26 19:27:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

return,break,next 這幾個(gè)關(guān)鍵字的使用都涉及到跳出作用域的問(wèn)題,而他們的不同 則在于不同的關(guān)鍵字跳出去的目的作用域的不同,因?yàn)橛写a塊則導(dǎo)致有一些地方需要格外注意。

return

常用方式

通常情況下的return語(yǔ)句和大家理解的意思是相同的。
代碼如下:
def m1 param
  if param == 1
    return 'returned 1'
  end
'returned default value'#根據(jù)Ruby語(yǔ)言規(guī)范,最后一條執(zhí)行語(yǔ)句的結(jié)果將作為返回值返回,retu rn是可     選的
end

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

在有異常捕獲的ensure時(shí),情況會(huì)稍有不同:
代碼如下:
def m1
  'return default'
ensure
  puts 'I am sure that it will be here!'
end

m1 # => return default

像這種情況,在ensure語(yǔ)句之前,無(wú)論是否顯示用return來(lái)返回,m1方法都會(huì)返回ensure之前的值, ensure語(yǔ)句只是確保之后的代碼塊puts 'I am sure that it will be here!'執(zhí)行,但是不會(huì)從這里返回。 如果在ensure語(yǔ)句中顯示的用return來(lái)返回值時(shí),情況就不一樣了。示例如下:
代碼如下:
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!

無(wú)論在ensure之前是否顯示返回,都只會(huì)返回ensure之后的值。

在有代碼塊干預(yù)的情況下,又會(huì)有所不同:
代碼如下:
def m1
  p 'start ... '
  proc do
    p 'block start'
    return
    p 'block end'
  end.call
  p 'end ... '
end

m1

# 輸出結(jié)果:
#
# "start ... "
# "block start"

這個(gè)應(yīng)該是在預(yù)料之中的,再看下一個(gè):
代碼如下:
def m1
  p 'start ... '
  -> do
    p 'block start'
   return
   p 'block end'
  end.call
  p 'end ... '
end

m1

# 輸出結(jié)果:
#
# "start ... "
# "block start"
# "end ... "

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

break

先來(lái)看一個(gè)簡(jiǎn)單的小例子:
代碼如下:
result = [1, 2, 3, 4, 5].map do |i|
  i * 2
end

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

這個(gè)沒(méi)什么奇怪的,那么看看下面這個(gè),來(lái)猜猜它的輸出結(jié)果是什么?

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 板桥市| 松江区| 宜丰县| 石门县| 江孜县| 从化市| 即墨市| 齐齐哈尔市| 拉孜县| 利津县| 富锦市| 平果县| 庆元县| 同江市| 封丘县| 海南省| 和硕县| 广宁县| 政和县| 三亚市| 舞阳县| 清远市| 桑日县| 萝北县| 措勤县| 永兴县| 葫芦岛市| 大足县| 田东县| 梅州市| 嘉峪关市| 金沙县| 辽宁省| 皋兰县| 呼伦贝尔市| 云安县| 巩义市| 泰宁县| 台东县| 安康市| 鹰潭市|