scala – Predef.StringCanBuildFrom的行为
我偶然发现Predef.StringCanBuildFrom令人惊讶的实现,打破了我在我的代码中对CanBuildFrom所做的假设.这是实施:
implicit def stringCanBuildFrom: CanBuildFrom[String,Char,String] = new CanBuildFrom[String,String] { def apply(from: String) = apply() def apply() = mutable.StringBuilder.newBuilder } apply(String)简单地忽略参数似乎完全不自然.对我来说,正确的实施应该是 implicit def stringCanBuildFrom: CanBuildFrom[String,String] { def apply(from: String) = apply() ++= from def apply() = mutable.StringBuilder.newBuilder } 但这似乎是微不足道的,以至于我无法相信我是那个因为语言存在而发现它的人.我很想为此开一个问题,但是如果我错过任何没有理由不做我的建议,请告诉我! 解决方法
我认为你误解了申请的目的(来自).
它的文件说:
因此,它用于使用集合的运行时类型来解析构建器,并且可能从原始集合中复制一些辅助数据.例如,scala.collection.generic.GenTraversableFactory#GenericCanBuildFrom中的实现只是def apply(from:Coll)= from.genericBuilder [A].如您所见,没有从参数集合中复制实际数据. 实际上,CanBuildFrom的实现会对map,flatMap和其他泛型函数的标准实现产生错误的结果: import scala.collection.generic.CanBuildFrom import scala.collection.mutable implicit def stringCanBuildFrom: CanBuildFrom[String,String] = new CanBuildFrom[String,String] { def apply(from: String) = apply() ++= from def apply() = mutable.StringBuilder.newBuilder } scala> "foo".map(identity)(stringCanBuildFrom) res1: String = foofoo (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ng build --prod ERROR in ./src/main.ts Module
- 打字稿 – 带有ReSharper 2016.1的Angular 2和Vi
- 在scala中匹配case类:?(a,b)匹配{case a~b => …
- angularjs – 使用带有socket.io的Angular
- Scala工厂使用apply方法的泛型类型?
- shell – 如何检查PHP中是否存在stdin(php-cgi)?
- 更新List的最后一个元素
- scala – 使用lift-json序列化没有字符串作为键的
- unix – 如何关闭iTerm2中的单词包装?
- 在Play Scala中使用Iteratees和Enumerators将数据