国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Ruby - Ruby中的block代碼塊學習教程

Ruby中的block代碼塊學習教程

2020-05-09 10:55zhangsai Ruby

在Ruby中,block并不是類,block可以被轉化為Proc類中衍生出的對象,剛接觸Ruby的話block是很難理解的一個點,接下來就為大家來總結Ruby中的block代碼塊學習教程

1、什么是代碼塊
Ruby中,{}或do...end之間的代碼是一個代碼塊。代碼塊只能出現在一個方法的后邊,它緊接在方法最后一個參數的同一行上,由yield關鍵字調用。例如:

?
1
2
3
4
5
[1,2,3,4,5].each { |i| puts i }
 
[1,2,3,4,5].each do |i|
puts i
end

塊變量:以yield關鍵字調用block也可以傳遞參數,block中豎線(|)之間給出的參數名用于接收來自yield的參數。

 豎線之間(如上例中的 | i |)的變量被稱作塊變量,作用和一個正常方法的參數一樣

2、掌握代碼塊的編寫
最常見、最簡單、最富爭議、最有Ruby風格的方式是blocks。寫法如下:

?
1
2
3
4
5
6
7
8
9
array = [1, 2, 3, 4]
 
array.collect! do |n|
 n ** 2
end
 
puts array.inspect
 
# => [1, 4, 9, 16]

do…end構成一個block。然后把這個block通過collect!傳給一個數組。就可以使用block中的n來迭代數組中每個元素。

collect!是Ruby庫里的方法,下面我們來寫一個自己的類似方法iterate!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Array
 def iterate!
  self.each_with_index do |n, i|
   self[i] = yield(n)
  end
 end
end
 
array = [1, 2, 3, 4]
 
array.iterate! do |n|
 n ** 2
end
 
puts array.inspect
 
# => [1, 4, 9, 16]

首先,我們打開Array,并添加進iterate!方法。方法名以!結尾表示危險方法,引起注意。現在我們就可能像使用collect!一樣使用iterate!

與屬性不同,在方法中不需要指定block的名字,而是使用yield來調用。yield會執行block中的代碼。同時,注意我們是怎么把n(each_with_index當前處理的數字)傳給yield的。傳給yield的參數即對應了block中的參數(||中的部分)。現在n就能被block調用并在yield調用中返回n**2。
整個調用如下:
1、一個整數組成的數組調用iterate!
2、當yield被調用時,把n(第一次為1,第二次為2,…)傳給block
3、block對n進行n**2。因為是最后一行,自動作為結果返回。
4、yield得到block的結果,并把值重寫到array里。
5、數據中每個對象執行相同操作。

3、{}和do...end優先級不同

在傳遞一個block時,使用{}傳遞的block比使用do…end的優先級要高;

為了避免引起歧義,最好使用()將參數括起來。例如:

?
1
2
3
4
5
1.upto 3 do |x|
 
puts x
 
end

是正確的,但是 1.upto 3 {|x| puts x} 編譯不通過,應該寫成   1.upto(3) {|x| puts x}

原因:

1.upto 3 do…end 中block會傳遞到upto方法里面,3會作為一個參數傳遞給upto

1.upto 3 {|x| puts x} 一句會把3當做函數名,將block傳遞到這個函數,其返回值作為upto方法的參數,所以編譯不過,需加()。

延伸 · 閱讀

精彩推薦
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動態語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
  • RubyRuby簡潔學習筆記(一):字符串、數字、類和對象

    Ruby簡潔學習筆記(一):字符串、數字、類和對象

    這篇文章主要介紹了Ruby簡潔學習筆記(一):字符串、數字、類和對象,本文是學習筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyCentOS中配置Ruby on Rails環境

    CentOS中配置Ruby on Rails環境

    經過一個上午的折騰,終于把ROR環境在CentOS中搞定,繞了很多彎路,把文章寫下來總結一下 ...

    可樂加糖4762020-04-12
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數,只有方法.而且實際上有不止一種方法.這一節我們介紹 訪問控制 (accesscontrols). 想想當我們在最高層而不是在一個類的定義里定義...

    ruby教程網3572020-04-08
  • RubyRuby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼,數據是隨機的,所以每次的記錄都會不同。 ...

    ruby教程網2962020-04-10
  • RubyRuby環境下安裝使用bundler來管理多版本的gem

    Ruby環境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應用實例來進行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • RubyRuby設計模式編程中使用Builder建造者模式的實例

    Ruby設計模式編程中使用Builder建造者模式的實例

    這篇文章主要介紹了Ruby設計模式編程中使用Builder建造者模式的實例,建造者模式將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表...

    范孝鵬2192020-05-07
主站蜘蛛池模板: 中文字幕在线一区二区三区 | 国产精品欧美一区二区三区 | 日韩在线观看一区 | 激情视频综合网 | 欧美综合色 | 亚洲国产免费 | 中文字幕 日韩有码 | 亚洲高清视频网站 | 日韩精品在线视频 | 精品国产乱码久久久久久影片 | 免费啪啪网站 | 日日摸天天做天天添天天欢 | 激情综合五月网 | 午夜激情影视 | 一级免费片| 交视频在线观看国产 | 欧美午夜在线观看 | 亚洲精品一区二区三区在线播放 | 亚洲综合伊人 | 成人免费视频a | 国产一区二区欧美 | 久久久精品国产 | 久久午夜影院 | 黄色一级电影在线观看 | 日韩精品 | 国产成人在线视频 | 亚洲成人一区二区三区 | 欧美激情视频一区二区三区不卡 | 日韩电影中文字幕 | 日韩精品成人 | 少妇看av一二三区 | 欧美日韩精品一区二区在线播放 | 超级av | 国产一区二区三区在线免费看 | 男女全黄一级一级高潮免费看 | 成年免费视频黄网站在线观看 | 一区在线视频观看 | 国产精品一区二区三区免费 | 中文字幕1区 | 日韩精品久久 | 成人精品一区二区 |