(!_._2.isEmpty)
中的解释标记是什么?
如:
def startsWith[A](s: Stream[A]): Boolean =
zipAll(s).takeWhile(!_._2.isEmpty) forAll {
case (h,h2) => h == h2
}
取自Stream。
这只是否定吗?
如果是,为什么!
和_
之间不需要空格?
不是!_
被解释为方法名称吗?
方法名称是否包含!
或以{{1}}开头?
答案 0 :(得分:1)
这只是否定。通过用更详细的名称替换_来扩展定义可能会使这更加明显。
def startsWith[A](s: Stream[A]): Boolean =
zipAll(s).takeWhile(!_._2.isEmpty) forAll {
case (h,h2) => h == h2
}
可以改写为
def startsWith[A](s: Stream[A]): Boolean =
zipAll(s).takeWhile( element => !element._2.isEmpty) forAll {
case (h,h2) => h == h2
}
._ 2只是元组中的第二项,在这种情况下,看起来这个列表是一对项目(稍后引用为h和h2),因此您也可以通过将项目解压缩为一对值来重写它如
def startsWith[A](s: Stream[A]): Boolean =
zipAll(s).takeWhile{ element =>
val (h, h2) = element
!h2.isEmpty
} forAll {
case (h,h2) => h == h2
}
答案 1 :(得分:0)
这只是否定吗?
是
如果是,为什么之间不需要空间!和_?
因为语法允许它
不是!_解释为方法名称?
不,因为.
关联强于!
,所以表达式被解析为!(_._2.isEmpty)
此外,!_
甚至不是有效的方法名称(再次,在语法中指定,见下文)
方法名称是否包含
!
或以{{1}}开头?
是的,但不是自由的。这里是标识符命名的规则,直接来自语言规范:
有三种方法可以形成标识符。首先,标识符可以以字母开头 其后可以是任意字母和数字序列。这可能是 接着是下划线' _ '字符和由两个字母组成的另一个字符串 和数字或操作符。其次,标识符可以从操作员开始 字符后跟任意一系列操作符。前面的 两种形式被称为 川 身份标识。最后,标识符也可以由a形成 后引号之间的任意字符串(主机系统可能会施加一些限制 哪些字符串对于标识符是合法的)。然后,标识符由所有标识符组成 不包括反引号本身的字符。 像往常一样,适用最长的匹配规则。
(The Scala Language Specification, Version 2.9, Chapter 1.1)