需要帮助了解此代码中 - >,{}和()的用法

时间:2012-07-10 13:26:48

标签: scala

以下是有问题的代码:

val oauth_params = IMap(
      "oauth_consumer_key" -> consumer.key,
      "oauth_signature_method" -> "HMAC-SHA1",
      "oauth_timestamp" -> (System.currentTimeMillis / 1000).toString,
      "oauth_nonce" -> System.nanoTime.toString
    ) ++ token.map { "oauth_token" -> _.value } ++
      verifier.map { "oauth_verifier" -> _ }

问题1 :哪些Scala功能启用"oauth_consumer_key" -> consumer.key存在并作为参数传递?

问题2:看到val oauth_params = IMap(...)token.map {...}哪些操作使用{}来传递值而不是通常的()?有具体规定吗?如果for循环是相关问题,为什么{{1}}循环允许同时使用?

我在这里问,因为我看到其他地方使用的功能。我也相信这两个问题都是相关的。

1 个答案:

答案 0 :(得分:7)

按顺序:

->Predef.scala中定义,在编译期间导入任何其他Scala源:

final class ArrowAssoc[A](val x: A) {
  @inline def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
  def →[B](y: B): Tuple2[A, B] = ->(y)
}
implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x)

正如你所看到的,有一个隐式转换将任何对象转换为ArrowAssoc [A],它有一个方法 - > [B]返回一个Tuple2 [A,B]。

IMap(...)它是对IMap.apply(...)方法的调用:在Scala中如果一个方法被命名为apply,你可以省略它。在这种情况下,它在Scala中以非常常见的模式用作工厂方法

class MyClass(....) {

}
object MyClass{ 
   def apply(....): MyClass = new MyClass(....)
}

val a = MyClass(a,b,c)

你刚刚看到的是一个Scala类及其伴随对象:一个单例,必须在与该类相同的源文件中定义,并且还可以访问类本身中的私有和受保护字段

map函数接收一个函数,该函数采用相同类型的集合并返回不同的类型。示例:List(1,2,3).map ( x => x * 2)。 ()和{}在Scala中可以与case结构互换。