新手问题 关于 inject 方法

youseke · 2013年05月30日 · 最后由 hello_little_yy 回复于 2013年05月30日 · 3104 次阅读

看到 (1..100).inject(:*)(1..100).inject(&:*) 两种写法 在版上查了一下,第二中情况会有:*/.to_proc 变换 但是具体的处理有什么不同呢? 非常基本的问题,多谢大家帮忙解答

和 inject 没关系,甚至和这种缩写的语法糖也没啥关系,实际上是一种设计上的一致性—— &导致 to_proc,例如:

def hello &x
  # 这里的x就是一个block被to_proc了
end

所以 &:* 和下面是一样的

$ irb
irb(main):001:0> :*.to_proc
=> #<Proc:0x0000000253fe60>

之前只有 &:*,后来进一步简化,有了 :* 。以后只使用后者就好了

他们的本质都是会自动调用 #.to_proc。

#1 楼 @fsword 多谢你的回复,我大概知道了&的作用 但我还想请教一下 (1..100).inject(&:*)是不是就相当于(1..100).inject{|x, y| x.__send__(:*, y) }

#2 楼 @alsotang 有些小区别,:* 参数是在库的层面上变成 proc 的 #3 楼 @youseke 大致上是这样

搜索到了这样的介绍

# Symbol#to_proc
def to_proc
  proc{|obj, *args| obj.send(self, *arg)}
end

不知道是不是这样的...

#2 楼 @alsotang 请问这是单单对 inject method 而言吗

#5 楼 @youseke 就使用场景来说,是的。而且一般大家都不用 inject 方法而用 reduce 方法,reduce 这个名字才是名门正派啊。另外也可以叫做 fold。

匿名 #7 2013年05月30日

#1 楼 @fsword 你的博客里面用的啥软件画图?

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