如何将块(成为Proc对象)传递给ruby方法



我正在阅读关于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对象,并且该对象将被指定给该参数。

现在,这一切都有道理,但我有一件事很困惑:为什么需要在initialize方法中将nameblock分配给@block?为什么需要name

对我来说,这似乎应该有效:

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

但是,当我尝试在irb中@block变为零时,我得到了一个错误,NoMethodError (undefined method "call" for nil:NilClass)

我不明白name@block的任务中做什么。这是有道理的,你会想通过";销售税;至CCD_ 9。但我不明白";销售税;正在被块使用。

赋值语法与块无关。相反,这里发生的事情被称为";并行分配";。

这样,您就可以通过一个原子操作从右侧的多个值中分配左侧的多个变量。从你的例子来看,这句话

@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方法中传递的金额计算税款。

相关内容

  • 没有找到相关文章

最新更新