5

这是有问题的代码:

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(...)and token.map {...},哪些操作{}用于传递值而不是通常的()?有具体的规定吗?for如果是相关问题,为什么允许循环同时使用两者?

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

4

1 回答 1

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 构造。

于 2012-07-10T13:43:25.767 回答