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

Scala 需要帮助了解->;的用法;,此代码中的{}和(),scala,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

下面是一段有问题的代码:

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\u consumer\u key->consumer.key
存在并作为参数传递

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

我在这里问,因为我看到其他地方正在使用这些功能。我还认为这两个问题是相关的。

顺序如下:

->
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)
如您所见,存在一种隐式转换,可以将任何对象转换为arrowssoc[A],它有一个返回Tuple2[A,B]的方法->[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构造除外。

\uuu
()
一样有效。只有当您想使用
大小写
或多个表达式时,才必须将其包装在
{}
块中。最后一部分不正确<代码>列表(1,2,3)。映射(*2)有效,至少在scala 2.9.2中有效。iirc,只要只有一个参数,就可以用
{}
代替
()
。它们实际上是不可互换的(例如
列表{1,2,3}
不起作用);只是当参数是一个函数文本时,
()
可以省略,当被
()
包围时,函数文本周围的
{}
可以省略。使用
case
的模式匹配必须始终被
{}
包围。关于()和{}的情况实际上要复杂得多。()在表达式周围时可以替换为{}。参数列表包含多个参数,
如果
/
声明,谁知道还有什么不符合条件。{}只有在包含单个语句且该语句是表达式(而不是声明)的情况下才能替换为()。