新手问题 有一段代码看不明白 (&:upcase)

springwq · 2014年01月18日 · 最后由 springwq 回复于 2014年01月19日 · 2727 次阅读

在看镐头书,有一段代码看不明白。

a.map 是将Array 变成了Enumerator, 但是 为什么 a.map(&:upcase) 就可以将枚举里面的所有元素都变成大写了呢?

搞不懂为什么(&:upcase)可以实现这样的功能?


a = %w{ a, b, c, d, e }

new_array = a.map(&:upcase)

# => new_array = [A, B, C, D, E]

&:upcase 等于:upcase.to_proc,可以参考一下 Symbol#to_proc

准确的说应该是&会调用后面的东西的 to_proc 方法。

class Foo
  def bar
    yield self,"bar"
  end

  def to_s(name)
    "foo: #{name}"
  end
end

>> Foo.new.bar(&:to_s)     # Foo.new.bar {|obj,name| obj.to_s(name) }
=> "foo: bar"

#4 楼 @lululau 这篇博文解释的很详细,谢谢!

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