2016-03-01 44 views
1

我正在做一些Ruby Koan練習。由於我是一個新手,所以有些代碼對我來說似乎沒有意義。例如,在一個參數在Ruby中的參數前做了什麼?

def method_with_explicit_block(&block) 
    block.call(10) 
end 

def test_methods_can_take_an_explicit_block_argument 
assert_equal 20, method_with_explicit_block { |n| n * 2 } 

add_one = lambda { |n| n + 1 } 
assert_equal 11, method_with_explicit_block(&add_one) 
end 

前面的&爲什麼有blockadd_one&?使它們成爲全局變量或將它們引用到以前的變量中?

謝謝!

+0

你基本上是通過一段代碼作爲參數,當在你的方法中使用'call'時,你在調用那個塊並在那裏使用它。因此,您可以看到'method_with_explicit_block({| n | n * 2})',您正在調用此方法並傳遞該塊參數。在方法'method_with_explicit_block'中,你可以看到它被稱爲'block.call(10)',並且一個參數爲'10'被傳遞給該塊。在塊{{| n | n * 2}','n = 10'在這種情況下。由於該塊調用是該方法中的最後一行,該塊的結果將返回。 –

回答

3

在方法定義一個參數的前面,一元前綴符號&印記是指:包傳遞給此方法作爲合適Proc對象塊。

在方法調用一個參數的前面,一元前綴符號&操作是指:通過發送它的消息to_proc(除非它已是一個Proc)和「展開作爲一個參數傳遞的對象轉換爲Proc 「它變成了一個塊,即將Proc視爲塊,而不是直接作爲塊傳遞。

1

實施例特效

multiples_of_3 = Proc.new do |n| 
    n%3 == 0 
end 

(1..100).to_a.select(&multiples_of_3) 

的情況下的 「&」 在這裏被用來PROC轉換成塊。

另一個例子 這是如何將引用傳遞給塊(而不是本地變量)的方法。 Ruby允許你將任何對象傳遞給方法,就好像它是一個塊一樣。該方法將嘗試使用傳入的對象,如果它已經是一個塊,但如果它不是一個塊,它會調用to_proc來嘗試將其轉換爲塊。

另請注意,塊部分(不帶&符號)只是引用的名稱,如果它對您更有意義,您可以使用任何名稱。

def my_method(&block) 
    puts block 
    block.call 
end 

my_method { puts "Hello!" } 
#<Proc:[email protected]/example.rb:6> 
Hello! 

正如可以在上面的示例中看到的,內my_method塊變量是對塊的參考,它可以與該呼叫方法來執行。調用塊與使用yield相同,有些人喜歡使用block.call而不是yield來提高可讀性。

相關問題