- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在斯卡拉 2.8 ,在 scala.collection.package.scala
中有一个对象:
def breakOut[From, T, To](implicit b : CanBuildFrom[Nothing, T, To]) =
new CanBuildFrom[From, T, To] {
def apply(from: From) = b.apply() ; def apply() = b.apply()
}
> import scala.collection.breakOut
> val map : Map[Int,String] = List("London", "Paris").map(x => (x.length, x))(breakOut)
map: Map[Int,String] = Map(6 -> London, 5 -> Paris)
breakOut
被称为我的
List
的参数?
最佳答案
答案可在 map
的定义中找到:
def map[B, That](f : (A) => B)(implicit bf : CanBuildFrom[Repr, B, That]) : That
breakOut
breakOut
的目的是什么? ?考虑为问题给出的示例,您获取一个字符串列表,将每个字符串转换为一个元组
(Int, String)
,然后产生一个
Map
从它。最明显的方法是产生一个中介
List[(Int, String)]
收集,然后转换它。
map
使用
Builder
要生成结果集合,是否可以跳过中介
List
并将结果直接收集到
Map
?显然,是的,确实如此。然而,要做到这一点,我们需要传递一个正确的
CanBuildFrom
至
map
,而这正是
breakOut
做。
breakOut
的定义:
def breakOut[From, T, To](implicit b : CanBuildFrom[Nothing, T, To]) =
new CanBuildFrom[From, T, To] {
def apply(from: From) = b.apply() ; def apply() = b.apply()
}
breakOut
被参数化,并且它返回一个
CanBuildFrom
的实例.碰巧,类型
From
,
T
和
To
已经被推断出来了,因为我们知道
map
期待
CanBuildFrom[List[String], (Int, String), Map[Int, String]]
.因此:
From = List[String]
T = (Int, String)
To = Map[Int, String]
breakOut
接收到的隐式本身。它的类型是
CanBuildFrom[Nothing,T,To]
.我们已经知道所有这些类型,因此我们可以确定我们需要一个类型为
CanBuildFrom[Nothing,(Int,String),Map[Int,String]]
的隐式。 .但是有这样的定义吗?
CanBuildFrom
的定义:
trait CanBuildFrom[-From, -Elem, +To]
extends AnyRef
CanBuildFrom
在它的第一个类型参数上是逆变的。因为
Nothing
是一个底层类(即它是所有东西的子类),这意味着任何类都可以用来代替
Nothing
.
map
的情况下,转换每个元素),并将结果存储在新集合中。
scala.collection.mutable.Builder
) 完成的,它基本上支持两种操作:附加元素和返回结果集合。此结果集合的类型将取决于构建器的类型。因此,一个
List
builder 将返回
List
,
Map
builder 将返回
Map
, 等等。
map
的执行方法不需要关心结果的类型:构建器会处理它。
map
需要以某种方式接收这个构建器。设计 Scala 2.8 Collections 时面临的问题是如何选择最好的构建器。例如,如果我要写
Map('a' -> 1).map(_.swap)
, 我想要一个
Map(1 -> 'a')
回来。另一方面,
Map('a' -> 1).map(_._1)
无法返回
Map
(它返回一个
Iterable
)。
Builder
来自已知类型的表达式是通过这个
CanBuildFrom
执行的隐含的。
CanBuildFrom
Map
而不是
List
.我回
List
稍后。现在,考虑这两个表达式:
Map(1 -> "one", 2 -> "two") map Function.tupled(_ -> _.length)
Map(1 -> "one", 2 -> "two") map (_._2)
Map
第二个返回
Iterable
.返回合身系列的神奇之处在于
CanBuildFrom
.让我们考虑
map
的定义再次理解它。
map
继承自
TraversableLike
.它在
B
上参数化和
That
,并使用类型参数
A
和
Repr
, 参数化类。让我们一起看看这两个定义:
TraversableLike
定义为:
trait TraversableLike[+A, +Repr]
extends HasNewBuilder[A, Repr] with AnyRef
def map[B, That](f : (A) => B)(implicit bf : CanBuildFrom[Repr, B, That]) : That
A
和
Repr
来自,让我们考虑
Map
的定义本身:
trait Map[A, +B]
extends Iterable[(A, B)] with Map[A, B] with MapLike[A, B, Map[A, B]]
TraversableLike
由扩展
Map
的所有特征继承,
A
和
Repr
可以从他们中的任何一个继承。不过,最后一个获得了偏好。因此,遵循不可变
Map
的定义以及所有与它相关的特征
TraversableLike
, 我们有:
trait Map[A, +B]
extends Iterable[(A, B)] with Map[A, B] with MapLike[A, B, Map[A, B]]
trait MapLike[A, +B, +This <: MapLike[A, B, This] with Map[A, B]]
extends MapLike[A, B, This]
trait MapLike[A, +B, +This <: MapLike[A, B, This] with Map[A, B]]
extends PartialFunction[A, B] with IterableLike[(A, B), This] with Subtractable[A, This]
trait IterableLike[+A, +Repr]
extends Equals with TraversableLike[A, Repr]
trait TraversableLike[+A, +Repr]
extends HasNewBuilder[A, Repr] with AnyRef
Map[Int, String]
的类型参数在整个链条中,我们发现类型传递给
TraversableLike
,因此,由
map
使用,是:
A = (Int,String)
Repr = Map[Int, String]
((Int, String)) => (Int, Int)
的函数。第二张 map 正在接收类型为
((Int, String)) => String
的函数.我使用双括号来强调它是一个正在接收的元组,因为这是
A
的类型正如我们所见。
map Function.tupled(_ -> _.length):
B = (Int, Int)
map (_._2):
B = String
map
返回的类型是
Map[Int,Int]
,第二个是
Iterable[String]
.看着
map
的定义,不难看出这些是
That
的值.但它们来自哪里?
Map
:
implicit def canBuildFrom [A, B] : CanBuildFrom[Map, (A, B), Map[A, B]]
Iterable
,其类由
Map
扩展:
implicit def canBuildFrom [A] : CanBuildFrom[Iterable, A, Iterable[A]]
CanBuildFrom
提供工厂.
CanBuildFrom
.在第二种情况下,由于第一个不匹配,它选择了第二个
CanBuildFrom
.
List
的和
map
的定义(再次)以查看如何推断类型:
val map : Map[Int,String] = List("London", "Paris").map(x => (x.length, x))(breakOut)
sealed abstract class List[+A]
extends LinearSeq[A] with Product with GenericTraversableTemplate[A, List] with LinearSeqLike[A, List[A]]
trait LinearSeqLike[+A, +Repr <: LinearSeqLike[A, Repr]]
extends SeqLike[A, Repr]
trait SeqLike[+A, +Repr]
extends IterableLike[A, Repr]
trait IterableLike[+A, +Repr]
extends Equals with TraversableLike[A, Repr]
trait TraversableLike[+A, +Repr]
extends HasNewBuilder[A, Repr] with AnyRef
def map[B, That](f : (A) => B)(implicit bf : CanBuildFrom[Repr, B, That]) : That
List("London", "Paris")
的类型是
List[String]
,所以类型
A
和
Repr
定义于
TraversableLike
是:
A = String
Repr = List[String]
(x => (x.length, x))
的类型是
(String) => (Int, String)
,所以
B
的类型是:
B = (Int, String)
That
是
map
的结果类型,我们也已经有了:
val map : Map[Int,String] =
That = Map[Int, String]
breakOut
必须,必须,返回
CanBuildFrom[List[String], (Int, String), Map[Int, String]]
的类型或子类型.
关于Scala 2.8 突破,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1715681/
我想跳出 .each() 迭代,但它不允许我这样做。这是我的代码。感谢您的帮助!欣赏它。 $('#btn-submit-add').click(function(){ var answerFi
假设我们有 Seq val ourSeq = Seq(10,5,3,5,4)。 我想返回一个新的列表,它从左边读取并在看到重复的数字时停止(例如 Seq(10,5,3) 因为 5 是重复的)。 我正在
当满足这样的条件时,我需要打破 seq 映射,其中 foo将返回一个对象列表,其中大小取决于找到 targetId 所需的时间 def foo(ids: Seq[String], targetId:
正在研究如何防止 iframe 跳出下一页。 http://www.virginaustralia.com/au/en/ 该页面在 iframe 中加载正常,但当我去搜索航类时,由于反 iframe
在斯卡拉 2.8 ,在 scala.collection.package.scala 中有一个对象: def breakOut[From, T, To](implicit b : CanBuildFr
我有以下疑问:是否可以使用鼠标监听器将“鼠标左键单击事件”超出组件的限制?或者我应该用另一种方法尝试这个? 我的问题如下。我正在创建一个适合我的项目的所见即所得面板。该面板与另一个面板是同级的,后者显
我在我的 Mac 上使用了两个 emacs(Aquamcs 和基于文本的 emacs)。我通常使用基于文本的 emacs 只是编辑一些东西,所以我不想用它加载任何东西。 我想出的是让 .emacs 中
请耐心等待,因为这是我的第一个主要 Python 项目。 我正尝试在 Python 中创建一个实用程序来协助 SteamCMD 功能。对于那些不了解 SteamCMD 或其功能的人来说,它本质上是一个
有没有办法绕过 MySQL 中 1024 字节的 key 大小限制?基本上,这在尝试执行复合索引时会造成严重破坏。 最佳答案 虽然我犹豫是否建议您做错了什么(因为我没有完整的细节),但单个 key (
所以我想弄清楚如何完全打破 C++ 中的递归函数。 在示例中,我有一个二维数组,其中包含正确的必要信息。在没有递归的情况下,一切都按预期工作 - 返回 time[start] 的部分中断了函数。 在递
我有这个简单的代码可以从控制台读取所有输入: input := bufio.NewScanner(os.Stdin) //Creating a Scanner that will read the i
我有一个 foreach 循环和一个 if 语句。如果找到匹配项,我需要最终突破 foreach。 foreach ($equipxml as $equip) { $current_devic
我正在关注文章中链接的以下 youtube 视频,该视频允许 docker 容器在主机上获得 root 访问权限。 有几个步骤不清楚,有人可以解释一下它们是如何进一步工作的吗? https://www
_.filter(this.pluck(key),function(item){ return item ? value.toLowerCase() === item.toLowerCase(
好吧,我的设置工作方式是这样的。 将新子项添加到数据库后 .on("child_added"...像这样被解雇: ref.on("child_added", function(snapshot, pr
receiveResponse 调用处于阻塞状态,当我在单独的线程上运行代码时,我希望能够随时干净地停止线程。文档显示 abort() 可能是我需要的,但我找不到任何信息表明它是否是线程安全的。谢谢,
我正在学习 XNA Break Out 克隆教程,我正在为 Windows Phone 编程。本教程在球和砖 block 的碰撞检测完成之前结束。积木按行和列放在屏幕上。我得到了 Racket 的边界
-- 编辑-- 我最近遇到了一件关于 promises 的奇怪事情,但我想这可能是因为它违反了 promises 的哲学。 考虑以下代码: // Assuming Auth is just a sim
我目前正在开发一个 Chrome 扩展程序,它模仿 Firefox 响应式设计 View 的行为和功能。 一切都快完成了,并且总体运行良好。然而,我遇到了一个问题,如果可能的话,我想避免它。我使用了一
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this q
我是一名优秀的程序员,十分优秀!