[英]Is there a method in Ruby Object to pass itself to a block or proc?
[英]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
分配name
和block
? 為什么需要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
另一種選擇是將數組解構為多個變量的能力。 在以下示例中,該方法返回一個數組,其元素被分配給兩個變量hello
和world
。
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.