- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Scala 的 ValueSet 中发现了一些令人费解的行为。使用这样的枚举,
object MyEnum extends Enumeration{
val V1 = new MyEnum
val V2 = new MyEnum
class MyEnum extends Val
implicit def convertValue(v: Value): MyEnum = v.asInstanceOf[MyEnum]
}
将 MyEnum.values
从 Value 映射到 MyEnum 会生成另一个 ValueSet,该 ValueSet 在转换为数组时不会保留映射的类型。
val naiveMappedValues = MyEnum.values.map(
implicitly[MyEnum.Value => MyEnum.MyEnum]).toArray
// REPL prints: naiveMappedValues: Array[MyEnum.Value] = Array(V1, V2)
如果 MyEnum.values
首先被转换为列表,那么最终数组的类型是正确的。
val mappedValues = MyEnum.values.toList.map(
implicitly[MyEnum.Value => MyEnum.MyEnum]).toArray
// REPL prints: mappedValues: Array[MyEnum.MyEnum] = Array(V1, V2)
为什么会这样?为什么在映射值之前需要先将ValueSet转换为List?
最佳答案
MyEnum.values
返回一个 Enumeration.ValueSet
。 ValueSet
子类型 Set[Value]
。当您在 ValueSet
上执行 map
时,它会尝试返回一个新的 ValueSet
给您,只要有新元素,它就可以返回是 Value
的子类型。但是,ValueSet
始终是 Set[Value]
,因此当元素向上转换回 Value 时,在 map 中完成的向下转换将被撤消
。另一方面,List
有一个类型参数,因此您可以将 List[Value]
映射到 List[MyEnum]
。
所有这些魔法都由 map
所采用的 CanBuildFrom
控制。如果您使用 collection.breakOut
,您可以强制 map
构建您想要的任何类型:
val fastMappedValues: Array[MyEnum.MyEnum] = MyEnum.values.map(
implicitly[MyEnum.Value => MyEnum.MyEnum])(collection.breakOut)
关于scala - 为什么映射到 Scala 枚举的 ValueSet 不会更改值的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23840986/
我的目标是将字符串数组作为值添加到 ValueSet 中。我可以在 C# 中完成,没有任何问题,但在 C++-WinRT 中会遇到一些问题。 我正在尝试将 array_view 传递给 box_val
我在 Scala 的 ValueSet 中发现了一些令人费解的行为。使用这样的枚举, object MyEnum extends Enumeration{ val V1 = new MyEnu
我在 Scala 的 ValueSet 中发现了一些令人费解的行为。使用这样的枚举, object MyEnum extends Enumeration{ val V1 = new MyEnu
我在相当高吞吐量的设置中使用 Scala Enumeration ValueSets - 创建、测试、合并和交叉大约 10M 集/秒/核心。我没想到这会是个大问题,因为我在某处读到过它们由 BitSe
我正在制作一个使用 AppServiceConnection 的 UWP 应用程序将数据发送到 COM 样式的应用程序。 AppServiceConnection.SendMessageAsync()
我正在尝试使用 MDHT 模型生成 QRDA1,并且坚持将 sdtc:valueset 属性设置为代码或值标记。下面的 QRDA 规范示例显示了 sdtc:valueset: CE code = Da
我是一名优秀的程序员,十分优秀!