刚遇到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为什么要对我的不规范的东西以及我想禁止重复的地方施加随机排序并允许重复?
[正如评论之一说,这里的问题是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
中的其他原因:
尚有map
的用途,不清楚保持原始数据结构是一个好主意。例如,在注释中使用:odd?
,在邮件列表线程中也有一个示例>>
{}.map {|k, v| "#{k}-#{v}"}
返回Hash
无效。
Range
和IO
,其中保留其类型的后映射是没有意义的,因此默认行为返回数组更一致。