zipAll(s)中感叹号的含义.takeWhile(!_._ 2.isEmpty)

时间:2014-10-13 09:26:02

标签: scala syntax

(!_._2.isEmpty)中的解释标记是什么?

如:

  def startsWith[A](s: Stream[A]): Boolean = 
    zipAll(s).takeWhile(!_._2.isEmpty) forAll {
      case (h,h2) => h == h2
    }

取自Stream

这只是否定吗?

如果是,为什么!_之间不需要空格?

不是!_被解释为方法名称吗?

方法名称是否包含!或以{{1}}开头?

2 个答案:

答案 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