@在scala中做什么[复制]

p1tboqfb  于 5个月前  发布在  Scala
关注(0)|答案(3)|浏览(70)

此问题在此处已有答案

Pattern Matching @ Symbol(2个答案)
22天前关闭
https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkStrategies.scala的第229行

case j @ ExtractEquiJoinKeys(joinType, leftKeys, rightKeys, nonEquiCond,

字符串
有@的用法,我在https://www.scala-lang.org/files/archive/spec/2.11/01-lexical-syntax.html中找不到定义
在这种情况下,“”的用法是什么?

dnph8jn4

dnph8jn41#

这称为纸样装订机。参见the language spec的第8.1.3节
直接从语言规范复制
模式绑定器x@p由模式变量x和模式p组成。变量x的类型是模式p所隐含的静态类型T。此模式匹配模式p所匹配的任何值v,并将变量名绑定到该值。
如果模式只匹配类型T的值,则模式p意味着类型T。
在更实际的情况下,in允许您以模式的形式“解包”构造函数,并为您提供对匹配的细粒度控制。您可以将其解包为符号(变量),静态值或其他嵌套模式,同时保持原始对象绑定到变量x

v6ylcynt

v6ylcynt2#

它是模式匹配部分的一部分:https://www.scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html#pattern-binders
(我不确定你是否特别链接到规范的词法分析部分,因为那是你要找的地方,或者那是整个规范的代表)
模式绑定器x@p由模式变量x和模式p组成
它只允许你 * 两者 * 写一个特定的模式来匹配(例如通过case表达式),同时也将一个变量绑定到匹配整个模式的值。
如果没有模式绑定器语法,您可以编写一个由单个变量组成的简单模式,这将使您给予轻松访问整个值,但不强制要求匹配更特定的模式,* 或者 * 你可以写一个更复杂的模式,但这样就不能访问整个值了。(而不需要复制一些代码来从模式中绑定的部分重新构建它)。模式绑定器语法允许您一次完成这两项工作,而不需要重复。

pod7payv

pod7payv3#

case class Person(name: String, age: Int)

val person: Person = Person("John", 30)

person match {
  case p @ Person("John", age) =>
    println(s"Found John with age $age")
  case _ =>
    println("Not a match")
}

字符串
在本例中,p @ Person(“John”,age)是一个匹配名为“John”的Person的模式。@符号允许您为整个匹配的模式给予一个名称(在本例中为p),因此您可以在箭头(=>)的右侧使用它。这样,您既可以匹配子模式,也可以引用整个匹配的对象。
在您提供的代码片段的上下文中,如果没有更多的上下文,就不清楚@的用途。提供的代码似乎不完整,如果能看到更多的周围代码或对其上下文的更详细的解释,将有助于提供更准确的解释。

相关问题