【问题标题】:Why are the arguments of reduce in the order they are?为什么 reduce 的参数按顺序排列?
【发布时间】:2018-05-31 00:18:41
【问题描述】:

我总是忘记 reduce 在 ruby​​ (https://ruby-doc.org/core/Enumerable.html#method-i-reduce) 中的参数,它是这样调用的:

(5..10).reduce { |sum, n| sum + n }

首先传入累加器是否有语言设计原因,还是只是任意选择? JS 的工作方式相同。

【问题讨论】:

  • 相关,如果不是重复stackoverflow.com/questions/41783001/…
  • 这很有趣。我会要求保持开放状态,以防万一有一个原因不仅仅是历史上它是如何完成的。我有一种预感,有些东西与函数式编程(currying,部分应用程序)相关,但我不知道。
  • 您好,您能多解释一下是什么让您感到困惑吗?您在序列 5、6、7、8、9、10 上调用 reduce,块的第一次迭代是 5 + 6。这对我来说似乎完全合乎逻辑,特别是因为 reduce 的语义本质上是“在所有元素之间插入操作”,即您的示例中的 5 + 6 + 7 + 8 + 9 + 10
  • @JörgWMittag 我并不感到困惑,我正在寻找一个原因,为什么将参数按照它们在函数本身的设计中的顺序放置。

标签: ruby


【解决方案1】:

这主要是为了让你可以做这样的事情:

(5..10).reduce(&:+)

扩展至:

(5..10).reduce { |a,b| a.send(:+, b) } 

相当于:

(5..10).reduce { |a,b| a + b }

所以这样说是有道理的。注意顺序与each_with_object相反。

【讨论】:

  • 我可能是错的,但不要认为 Symbol#to_proc(以及 &:sym)是在 Ruby 1.8.7 之前引入的,这在 inject 的参数顺序被选择之后很久。
  • @JordanRunning 这是一个有趣的观点,但这可能是意图。
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
相关资源
最近更新 更多