当前位置:  开发笔记 > 后端 > 正文

为什么我们要说`arr.inject(:+)`但必须说`arr.map(&:to_s)`?

如何解决《为什么我们要说`arr.inject(:+)`但必须说`arr.map(&:to_s)`?》经验,为你挑选了1个好方法。

看来我们可以随时使用&:+。为什么inject需要:+map必须采取&:to_s?如果原因是map不能带符号但必须带一个块,那么也map带符号是否有意义?

[1,3,5].inject(:+)   # => 9
[1,3,5].inject(&:+)  # => 9
[1,3,5].map(&:to_s)  # => ["1", "3", "5"]
[1,3,5].map(:to_s)   # => ArgumentError: wrong number of arguments (1 for 0)

sawa.. 5

这是设计使然。inject允许其他语法在map需要块的情况下采用符号。

允许inject但不允许使用符号参数的原因可能map是因为inject总是返回迭代的结果对象,而map被设计为Enumerator在缺少块时返回实例。并且如果没有该块,那么如果必须查看是否提供了符号参数以决定是否返回Enumerator或映射的Array实例,则会变得很复杂。因此,Ruby设计人员为方法制定了一条简单的规则,例如map缺少块意味着返回值将是Enumerator

具有讽刺意味的是,inject允许符号的缺点是不能将符号作为的初始值传递inject。但可能是,Ruby的设计师认为这种情况很少见。



1> sawa..:

这是设计使然。inject允许其他语法在map需要块的情况下采用符号。

允许inject但不允许使用符号参数的原因可能map是因为inject总是返回迭代的结果对象,而map被设计为Enumerator在缺少块时返回实例。并且如果没有该块,那么如果必须查看是否提供了符号参数以决定是否返回Enumerator或映射的Array实例,则会变得很复杂。因此,Ruby设计人员为方法制定了一条简单的规则,例如map缺少块意味着返回值将是Enumerator

具有讽刺意味的是,inject允许符号的缺点是不能将符号作为的初始值传递inject。但可能是,Ruby的设计师认为这种情况很少见。

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有