新手问题 方法定义时给参数加 “&” 的试用场景?

zacker330 · 2014年06月15日 · 最后由 zacker330 回复于 2014年06月16日 · 1959 次阅读

小弟不才,学 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

用法

# 注意这里带了一个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"是可以这样用的。

然后,你的意思是说&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. 存储 (如你代码所做的), 传递给其他方法等), 使用 & 显式传入。

#5 楼 @Alexander 你是对的。我昨天看书时才知道。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号