- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于 Scala 新手来说,一个隐含的问题似乎是:编译器在哪里寻找隐式?我的意思是隐含的,因为这个问题似乎从来没有完全形成,好像没有词可以形容。 :-) 例如,integral
的值在哪里?下面从哪里来?
scala> import scala.math._
import scala.math._
scala> def foo[T](t: T)(implicit integral: Integral[T]) {println(integral)}
foo: [T](t: T)(implicit integral: scala.math.Integral[T])Unit
scala> foo(0)
scala.math.Numeric$IntIsIntegral$@3dbea611
scala> foo(0L)
scala.math.Numeric$LongIsIntegral$@48c610af
scala.Predef
定义来自
String
的两个转换: 一到
WrappedString
另一个到
StringOps
.然而,这两个类共享很多方法,那么为什么 Scala 在调用
map
时不提示歧义? ?
最佳答案
隐式类型
Scala 中的隐式指的是可以“自动”传递的值,可以这么说,或者是自动进行从一种类型到另一种类型的转换。
隐式转换
简单说一下后一种类型,如果调用一个方法m
在对象上 o
类(class)C
,并且该类不支持方法 m
,那么 Scala 将寻找来自 C
的隐式转换到确实支持的东西 m
.一个简单的例子是方法 map
在 String
:
"abc".map(_.toInt)
String
不支持该方法
map
,但是
StringOps
确实如此,而且还有来自
String
的隐式转换至
StringOps
可用(请参阅
implicit def augmentString
上的
Predef
)。
breakOut
,例如(请参阅有关
breakOut
的问题,在您准备迎接挑战的那一天)。
foo
方法声明:
def foo[T](t: T)(implicit integral: Integral[T]) {println(integral)}
def getIndex[T, CC](seq: CC, value: T)(implicit conv: CC => Seq[T]) = seq.indexOf(value)
getIndex("abc", 'a')
getIndex
可以接收任何对象,只要存在从其类到
Seq[T]
的隐式转换可用.因此,我可以通过
String
至
getIndex
,它会起作用。
seq.IndexOf(value)
至
conv(seq).indexOf(value)
.
getIndex
可以这样定义:
def getIndex[T, CC <% Seq[T]](seq: CC, value: T) = seq.indexOf(value)
CC <: Seq[Int]
)或下限(
T >: Null
)。
Integral
您提到的类是类型类模式的经典示例。 Scala 标准库的另一个例子是
Ordering
.有一个库大量使用了这种模式,称为 Scalaz。
def sum[T](list: List[T])(implicit integral: Integral[T]): T = {
import integral._ // get the implicits in question into scope
list.foldLeft(integral.zero)(_ + _)
}
def sum[T : Integral](list: List[T]): T = {
val integral = implicitly[Integral[T]]
import integral._ // get the implicits in question into scope
list.foldLeft(integral.zero)(_ + _)
}
sorted
在
Seq
需要一个隐含的
Ordering
.创建方法
reverseSort
,可以这样写:
def reverseSort[T : Ordering](seq: Seq[T]) = seq.sorted.reverse
Ordering[T]
被隐式传递给
reverseSort
,然后可以将其隐式传递给
sorted
.
implicit val n: Int = 5
def add(x: Int)(implicit y: Int) = x + y
add(5) // takes n from the current scope
import scala.collection.JavaConversions.mapAsScalaMap
def env = System.getenv() // Java map
val term = env("TERM") // implicit conversion from Java Map to Scala Map
def sum[T : Integral](list: List[T]): T = {
val integral = implicitly[Integral[T]]
import integral._ // get the implicits in question into scope
list.foldLeft(integral.zero)(_ + _)
}
Option
存在到
Iterable
的隐式转换,所以可以拨打
Iterable
Option
上的方法,或通过
Option
期待
Iterable
.例如:
for {
x <- List(1, 2, 3)
y <- Some('x')
} yield (x, y)
List(1, 2, 3).flatMap(x => Some('x').map(y => (x, y)))
List.flatMap
期待
TraversableOnce
, 其中
Option
不是。编译器然后查看内部
Option
的对象伴侣并找到转换为
Iterable
,这是一个
TraversableOnce
,使这个表达式正确。
List(1, 2, 3).sorted
sorted
采用隐式
Ordering
.在这种情况下,它查看对象内部
Ordering
, 类(class)同伴
Ordering
,并找到一个隐含的
Ordering[Int]
那里。
class A(val n: Int)
object A {
implicit def str(a: A) = "A: %d" format a.n
}
class B(val x: Int, y: Int) extends A(y)
val b = new B(5, 2)
val s: String = b // s == "A: 2"
Numeric[Int]
和
Numeric[Long]
顺便说一下,在您的问题中,它们可以在
Numeric
中找到,不是
Integral
.
A
的方法,然后是类型
A
的隐式作用域也会考虑。 “隐式作用域”是指所有这些规则都将递归应用——例如,
A
的伴随对象。将按照上述规则搜索隐式。
A
的隐含范围将搜索该参数的转换,但整个表达式的转换。例如:
class A(val n: Int) {
def +(other: A) = new A(n + other.n)
}
object A {
implicit def fromInt(n: Int) = new A(n)
}
// This becomes possible:
1 + new A(1)
// because it is converted into this:
A.fromInt(1) + new A(1)
Ordering
,例如:它在它的伴生对象中带有一些隐式,但你不能向它添加东西。那么如何制作
Ordering
为您自己的类(class)自动找到?
class A(val n: Int)
object A {
implicit val ord = new Ordering[A] {
def compare(x: A, y: A) = implicitly[Ordering[Int]].compare(x.n, y.n)
}
}
List(new A(5), new A(2)).sorted
sorted
期待
Ordering[A]
(实际上,它需要一个
Ordering[B]
,其中
B >: A
)。里面没有这样的东西
Ordering
,并且没有可以查看的“源”类型。很明显,它是在
A
里面找到的。 ,这是
Ordering
的类型参数.
CanBuildFrom
工作:在
CanBuildFrom
的类型参数的伴随对象中找到隐式.
Ordering
定义为
trait Ordering[T]
,其中
T
是一个类型参数。之前说Scala是看内部类型参数的,没多大意义。上面隐式查找的是
Ordering[A]
,其中
A
是实际类型,而不是类型参数:它是
Ordering
的类型参数.请参阅 Scala 规范的第 7.2 节。
class A(val n: Int) {
class B(val m: Int) { require(m < n) }
}
object A {
implicit def bToString(b: A#B) = "B: %d" format b.m
}
val a = new A(5)
val b = new a.B(3)
val s: String = b // s == "B: 3"
关于scala - Scala 在哪里寻找隐式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5598085/
我刚刚更新了 Ruby,现在我在尝试启动 compass 时遇到以下错误: Encoding::CompatibilityError on line ["28"] of /usr/local/Cell
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试在我的 iOS 应用程序中开发可折叠/ Accordion 式的功能。这将是您可以在网站上找到的典型 FAQ 类型功能。我想点击标题,然后显示详细信息。 因为这是帮助部分,只有几个项目,我认
我正在尝试设计一个基于 REST 的 Web 服务来与我正在开发的农场动物管理系统进行交互。 为了详细说明问题,我收藏了动物 属于一个农场。每只动物都有自己的信息——例如姓名、身份证号、品种年龄等。因
我有 3 种不同的表单,其中复选框数量不同,每个部分基本上代表一个表单,因此当用户选择该部分中的复选框时,它会显示他们在该部分的总金额中 checkout 了多少 HTML
我有一份 32 页的 PDF 版家谱。与其将家谱全部放在一个非常大的 PDF 页面上(这是我想要的),不如将其格式化为一组 8 个单独的美国信纸大小的页面应该在整个宽度上缝合; 4 行这样就完成了树。
指SASS implementation for Java? : 在 Maven 目标编译包中自动编译 compass-style.org 样式表的最佳方法是什么? 我不想发送太多的自编译库,也不想通
鉴于以下 XAML... 我正在寻找一种绑定(bind) ComboBox、Button 和 Command 的方法,以便当 ComboBox 的值更改时,在 Command 上调用 CanExe
在玩具应用程序中,我有一个显示所有帖子标题的“帖子”模板。当您单击每个标题时,我不想直接进入“显示” View ,而是直接内联展开该帖子的其余内容。 我考虑过让 postRoute 重用 postsR
我需要一些使用 Twitter Bootstrap 或其他响应式框架的自定义 Swagger-UI 实现。需要在我的移动设备上使用这样的 UI 测试我的 API,但 swagger-ui 不能很好地扩
我正在做一个项目,我真的在尝试编写面向对象的 JavaScript 代码。我刚刚开始阅读Douglas Crockford's JavaScript: The Good Parts我很快开始意识到用
在 C# 中,我通过执行以下操作来加密文本数据(请注意我正在以 block ( block )的形式加密数据): public string EncryptData(string pu
我正在构建一个社交网站,该网站将向全世界公开 REST API (WCF WebAPI),以便任何开发人员都能够为该网站创建客户端应用程序、将其与其他服务集成等。 我想为 API 实现 Faceboo
我是一名优秀的程序员,十分优秀!