簡體   English   中英

如何將塊(成為 Proc 對象)傳遞給 ruby 方法

[英]How to pass a block (which becomes a Proc object) to a ruby method

我正在閱讀關於 Ruby 的 Pickaxe,我遇到了這個例子:

class TaxCalculator
  def initialize(name, &block)
    @name, @block = name, block
  end

  def get_tax(amount)
    "#@name on #{amount} = #{@block.call(amount)}"
  end
end

tc = TaxCalculator.new ("Sales tax") {|amt| amt * 0.075 }

tc.get_tax(100) # => "Sales tax on 100 = 7.5"
tc.get_tax(250) # => "Sales tax on 250 = 18.75"

該示例的重點是說明,如果您在方法定義中的最后一個參數前加上與號,則任何關聯的塊都將轉換為 Proc object,並且 object 將分配給該參數。

現在,這一切都說得通了,但我被一件事難住了:為什么需要在初始化方法中為@block分配nameblock 為什么需要name

對我來說,這似乎應該有效:

 def initialize(name, &block)
   @name, @block = block
 end

但是,當我在 irb 中嘗試@block變為 nil 並且出現錯誤時, NoMethodError (undefined method "call" for nil:NilClass)

我不明白該@block分配中的name在做什么。 您希望將“銷售稅”傳遞給@name是有道理的。 但我看不到該街區如何使用“銷售稅”。

賦值語法與塊無關。 相反,這里發生的事情稱為“並行分配”。

這樣,您可以通過一個原子操作從右側的多個值中分配左側的多個變量。 從您的示例中,此語句

@name, @block = name, block

相當於

@name = name
@block = block

在這個例子中,這種用法更多的是一種噱頭(我會在代碼審查中標記)。 但是,在某些模式中並行分配非常有用。

最重要的是能夠切換兩個變量的值而不需要中間變量:

a = 1
b = 2
a, b = b, a

另一種選擇是將數組解構為多個變量的能力。 在以下示例中,該方法返回一個數組,其元素被分配給兩個變量helloworld

def get_array
  [:hello, :world]
end

hello, world = get_array

該示例使用 Ruby 的並行賦值運算符。

age, salary = 30, 3000   # age=30, salary=3000
age, salary = 30         # age=30, salary=nil
age, salary = [30, 3000] # age=30, salary=3000

但我看不到該街區如何使用“銷售稅”。

該塊未使用“銷售稅”。 它只是計算在get_tax方法中傳遞的金額的稅。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM