小弟不才,学 ruby 不久。
请问方法定义时给参数加“&”的试用场景?
class TaxCalculator
def initialize(name, &block) @name , @block = name, block end
def get_tax(amount) “#@name on #{amount} = #{@block.call(amount)}" end
end
谢谢啦
这里的&特指 block, 意思是这个参数是一个 block。其实也可以省略,在内部用 yield 代表。这种明着说出来的表达方式会好一点。
另外注意 initialize 里面直接把 block 参数做成了一个 instance variable。它本质上是一个 proc,所以调用时要加call。
call
用法
# 注意这里带了一个block tax = TaxCalculater.new('foo') do |amount| amount * 0.1 end tax.get_tax(100) #=> "foo on 100 = 10" #问题中有笔误, @name没有加{}
TaxCalculator.new('cal1') { |x| x*0.1 } &参数对应后面的{}块。也就是你可以提供不同的块,来计算 tax
#1 楼 @billy "#@name"是可以这样用的。
"#@name"
然后,你的意思是说&block 实际上就是下面:
class TaxCalculator def initialize(name) @name = name end def get_tax(amount) “#@name on #{amount} = #{yield(amount)}" end end
@zacker330 不是的,按你的代码的原意,是这样
def initialize(name) @name = name @block = yield if yield end
不过,这种直接定义@block的方式很少见,至少我是没有见过。
如果你需要把 block 作为值使用的话 (i.e. 存储 (如你代码所做的), 传递给其他方法等), 使用 & 显式传入。
block
&
#5 楼 @Alexander 你是对的。我昨天看书时才知道。