以下是有问题的代码:
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}}循环允许同时使用?
我在这里问,因为我看到其他地方使用的功能。我也相信这两个问题都是相关的。
答案 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结构互换。