gpt4 book ai didi

ruby - 为什么我们可以说 `arr.inject(:+)` 而不得不说 `arr.map(&:to_s)` ?

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:06 24 4
gpt4 key购买 nike

看来我们总是可以使用&:+。为什么inject可以取:+map必须取&:to_s?如果原因是 map 不能带符号而必须带 block ,那么 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)

最佳答案

这是设计使然。 inject 允许使用替代语法来获取符号,而 map 始终需要一个 block 。

inject 中允许符号参数但 map 中不允许符号参数的原因可能是因为 inject 总是返回迭代的结果对象,而 map 旨在在 block 不存在时返回 Enumerator 实例。如果 block 不存在,如果它必须查看是否提供了符号参数以决定是返回 Enumerator 还是映射的 Array,这将变得复杂实例。因此,Ruby 设计者为像 map 这样的方法制定了一个简单的规则,即没有 block 意味着返回值将是一个 Enumerator

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

关于ruby - 为什么我们可以说 `arr.inject(:+)` 而不得不说 `arr.map(&:to_s)` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34536267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com