在这个Scala示例中,波浪号(〜)的含义是什么?

rip*_*234 10 scala anorm

http://woss.name/2012/04/02/retrieving-bigdecimals-from-a-database-with-anorm-scala/

object Site {
  val allFieldsParser = {
    get[Pk[Long]]("sites.id") ~     // Help me parse this syntax
    get[String]("sites.name") ~
    get[BigDecimal]("sites.latitude") ~
    get[BigDecimal]("sites.longitude") map {
      case id ~ name ~ latitude ~ longitude =>
        Site(id, name, latitude, longitude)
    }
  }

  def findAll(): Seq[Site] = {
    DB.withConnection { implicit connection =>
      SQL("SELECT * FROM sites").as(Site.allFieldsParser *)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

ste*_*tew 23

在你的例子中,〜以两种不同的方式用于表示两种不同的东西.在第一部分,你有

get[Pk[Long]]("sites.id") ~     // Help me parse this syntax
get[String]("sites.name") ~
get[BigDecimal]("sites.latitude") ~
Run Code Online (Sandbox Code Playgroud)

正如已经指出的那样,这只是方法调用,它是一样的

get[Pk[Long]]("sites.id").~(get[String]("sites.name").~(...
Run Code Online (Sandbox Code Playgroud)

您可以在anorm源中查看此方法的定义.它是一个RowParser[A]解析一个解析器的方法,它解析A一个RowParser[B](解析器解析一个解析器B)并返回一个解析器的解析器A ~ B.这A ~ B是第二个含义~.现在这不是指一个方法,而是指一个方法.case类在这里定义在同一个文件中.

case class ~[+A, +B](_1: A, _2: B)
Run Code Online (Sandbox Code Playgroud)

这只是一种引用课堂的特殊方式~[A,B].在类型级别,当您有两个参数类型构造函数时,可以在中缀表示法中使用该类的名称.这不是什么特别的事情~,它适用于任何两个参数类型构造函数.如果你有,trait Foo[A,B]你可以将其称为A Foo B.类似地,在模式匹配中,变量ab可以使用语法绑定,在语言规范的 8.1.10节中a Foo b称为中缀操作模式.

在您的示例的第二部分中,您有:

case id ~ name ~ latitude ~ longitude =>
Run Code Online (Sandbox Code Playgroud)

这是对这些~case clases的模式匹配,这是运行上面构造的解析的结果.所以这真的只是一种更好的写作方式:

case ~(~(~(id, name), latitude), longitude) =>
Run Code Online (Sandbox Code Playgroud)


gzm*_*zm0 6

在斯卡拉

a ~ b
Run Code Online (Sandbox Code Playgroud)

手段

a.~(b)
Run Code Online (Sandbox Code Playgroud)

所以它调用方法~a,并给出b作为参数.另请注意,任何未以结尾的运算符:都是左关联的.

重新访问的例子是:

get[Pk[Long]]("sites.id").~(     // Help me parse this syntax
get[String]("sites.name").~(
get[BigDecimal]("sites.latitude").~(
get[BigDecimal]("sites.longitude")))) map {
  case id ~ name ~ latitude ~ longitude =>
    Site(id, name, latitude, longitude)
}
Run Code Online (Sandbox Code Playgroud)