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
的模式匹配必须始终被{}
包围。关于()和{}的情况实际上要复杂得多。()在表达式周围时可以替换为{}。参数列表包含多个参数,如果
/而
声明,谁知道还有什么不符合条件。{}只有在包含单个语句且该语句是表达式(而不是声明)的情况下才能替换为()。