为什么Set#map返回一个数组而不是另一个Set?

问题描述 投票:0回答:1

刚遇到TypeError: no implicit conversion of Set into Array做某种形式的事情

thingGetterSet.map{|m| m.getThing }.select{|t| t.appropriate? } + appropriateThingsSet

结果是Set#map返回一个数组,我希望其中的一个Set可以映射到另一个Set。

即使返回了一个集合,Set#select也会返回一个数组,在这里我也期望有一个集合。

这里发生了什么?为什么Ruby为什么要对我的不规范的东西以及我想禁止重复的地方施加随机排序并允许重复?

ruby collections set containers enumerable
1个回答
0
投票

[正如评论之一说,这里的问题是Set包含Enumerable作为包括map的一堆方法的提供者。这是一种语言设计决策,因此我能给的最好答案是将您指向开发人员的邮件列表。这是几年前的一个有趣的线程:“ Hash#select return type does not match Hash#find_all”,尤其是“ [Ruby trunk Bug#13795] Hash#select return type does not match Hash#find_all”。

[我在线程中看到一些不重新实现map的原因,而在Set中的其他原因:

  1. 这与使用通用Enumerable的好处相反,因为包含该模块的类将不得不重新实现一堆方法(这不是主要原因),因此会导致额外的实现工作。 >
  2. 尚有map的用途,不清楚保持原始数据结构是一个好主意。例如,在注释中使用:odd?,在邮件列表线程中也有一个示例>>

    {}.map {|k, v| "#{k}-#{v}"}
    
  3. 返回Hash无效。

  4. [还有其他标准库类,例如RangeIO,其中保留其类型的后映射是没有意义的,因此默认行为返回数组更一致。
© www.soinside.com 2019 - 2024. All rights reserved.