帶塊的方法調用

發表于:2007-07-04來源:作者:點擊數: 標簽:
3.1 什么是"帶塊的方法調用"? 有些方法允許在調用它的過程中添加塊或者過程對象, 這種特殊的方法調用就是"帶塊的方法調用"。 這原本是為了對控制結構(特別是循環)進行抽象而設置的功能, 因此有時也被稱作迭代器. 當然了, 若您只想調用塊而不進行iterate(迭代)
3.1 什么是"帶塊的方法調用"?

有些方法允許在調用它的過程中添加塊或者過程對象, 這種特殊的方法調用就是"帶塊的方法調用"。

這原本是為了對控制結構(特別是循環)進行抽象而設置的功能, 因此有時也被稱作迭代器. 當然了, 若您只想調用塊而不進行iterate(迭代)操作時,也可以使用它.

下例中就用到了迭代器。

data = [1, 2, 3] data.each do |i| print i, "\n" end

它會輸出如下內容。

$ ruby test.rb 1 2 3

也就是說,do和end之間的塊被傳遞給方法, 供其差遣。each方法分別為data中的每個元素來執行塊的內容。

用C語言來改寫的話,就是

int data[3] = {1, 2, 3}; int i; for (i = 0; i < 3; i++) { printf("%d\n", data[i]); }

用for來編寫代碼時, 必須自己進行迭代處理. 相反地, 使用帶塊的方法調用時, 則由方法負責處理, 這大大減少了因誤判循環邊界而導致bug的可能性。

另外, 除了do...end之外, 您還可以使用{...}。

data = [1, 2, 3] data.each { |i| print i, "\n" }

這段代碼與前面的完全等效。但這并不標明do...end與{...}完全等效。例如

foobar a, b do .. end # 此時foobar被看做是帶塊的方法 foobar a, b { .. } # 而此時 b被看做是帶塊的方法

這說明{ }的結合力大于do塊。

3.2 怎么將塊傳遞給帶塊方法?

如果想將塊傳遞給帶塊方法, 只需要將塊放在方法后面即可. 另外, 還可以在表示過程對象的變量/常數前添加&, 并將其作為參數傳遞給方法即可。

3.3 如何在主調方法中使用塊?

有3種方式可以讓您在方法中使用塊. 它們分別是yield控制結構、塊參數和Proc.new。(在由C語言寫成的擴展庫中,需要使用rb_yield)

使用yield時, yield后面的參數會被傳遞給塊, 然后執行塊的內容。

塊參數是指,插在方法定義中的參數列表末尾的 形如&method的參數. 可以在方法中,這樣method.call(args...)來進行調用。

使用Proc.new時, 它會接管傳遞給方法的塊, 并以塊的內容為范本生成一個過程對象。proc或lamda也是一樣。

def a (&b) yield b.call Proc.new.call proc.call lambda.call end a{print "test\n"} 3.4 為什么Proc.new沒有生成過程對象呢?

若沒有給出塊的話, Proc.new是不會生成過程對象的, 而且還會引發錯誤。在方法定義中插入Proc.new時, 一般都假定在方法調用時會傳過來一個塊。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97