看到 (1..100).inject(:*) 和 (1..100).inject(&:*) 两种写法 在版上查了一下,第二中情况会有:*/.to_proc 变换 但是具体的处理有什么不同呢? 非常基本的问题,多谢大家帮忙解答
(1..100).inject(:*)
(1..100).inject(&:*)
和 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) }
(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。
#1 楼 @fsword 你的博客里面用的啥软件画图?