Scala语法有很多符号。由于使用搜索引擎很难找到这些类型的名字,所以一个全面的列表将会很有帮助。
Scala中所有的符号都是什么,每个符号都有什么作用?
特别地,我想知道 ->, ||=, ++=, <=, _._,::,和:+=。
Scala语法有很多符号。由于使用搜索引擎很难找到这些类型的名字,所以一个全面的列表将会很有帮助。
Scala中所有的符号都是什么,每个符号都有什么作用?
特别地,我想知道 ->, ||=, ++=, <=, _._,::,和:+=。
当前回答
<=就像你会“读”它:'小于或等于'。所以它是一个数学运算符,在<(小于?)、>(大于?)、==(等于?)、!=(不等于?)、<=(小于或等于?)和>=(大于或等于?)的列表中。
这不能与=>混淆,后者是一种右向双箭头,用于将参数列表与函数体分离,并将模式匹配中的测试条件(case块)与匹配发生时执行的函数体分离。你可以在我之前的两个回答中看到这样的例子。一、函数使用:
coll.map(tup => tup._2.reverse)
它已经被缩写为省略了类型。接下来的函数是
// function arguments function body
(tup: Tuple2[Int, String]) => tup._2.reverse
与模式匹配使用:
def extract2(l: List[Int]) = l match {
// if l matches Nil return "empty"
case Nil => "empty"
// etc.
case ::(head, Nil) => "exactly one element (" + head + ")"
// etc.
case ::(head, tail) => "more than one element"
}
其他回答
Scala继承了Java的大部分算术运算符。这包括位-或|(单个管道字符)、位-和&、位-异-或^,以及逻辑(boolean)或||(两个管道字符)和逻辑-和&&。有趣的是,你可以在布尔上使用单字符操作符,所以java的逻辑操作符是完全多余的:
true && true // valid
true & true // valid as well
3 & 4 // bitwise-and (011 & 100 yields 000)
3 && 4 // not valid
正如在另一篇文章中指出的那样,以等号=结尾的调用将通过重赋来解析(如果该名称不存在!):
var x = 3
x += 1 // `+=` is not a method in `int`, Scala makes it `x = x + 1`
这种“双重检查”使得可以轻松地将可变集合转换为不可变集合:
val m = collection.mutable.Set("Hallo") // `m` a val, but holds mutable coll
var i = collection.immutable.Set("Hallo") // `i` is a var, but holds immutable coll
m += "Welt" // destructive call m.+=("Welt")
i += "Welt" // re-assignment i = i + "Welt" (creates a new immutable Set)
作为Daniel和0__精彩回答的补充,我不得不说Scala理解某些符号的Unicode类比,所以代替
for (n <- 1 to 10) n % 2 match {
case 0 => println("even")
case 1 => println("odd")
}
你可以这样写
for (n ← 1 to 10) n % 2 match {
case 0 ⇒ println("even")
case 1 ⇒ println("odd")
}
<=就像你会“读”它:'小于或等于'。所以它是一个数学运算符,在<(小于?)、>(大于?)、==(等于?)、!=(不等于?)、<=(小于或等于?)和>=(大于或等于?)的列表中。
这不能与=>混淆,后者是一种右向双箭头,用于将参数列表与函数体分离,并将模式匹配中的测试条件(case块)与匹配发生时执行的函数体分离。你可以在我之前的两个回答中看到这样的例子。一、函数使用:
coll.map(tup => tup._2.reverse)
它已经被缩写为省略了类型。接下来的函数是
// function arguments function body
(tup: Tuple2[Int, String]) => tup._2.reverse
与模式匹配使用:
def extract2(l: List[Int]) = l match {
// if l matches Nil return "empty"
case Nil => "empty"
// etc.
case ::(head, Nil) => "exactly one element (" + head + ")"
// etc.
case ::(head, tail) => "more than one element"
}
Scala和其他语言的一个(在我看来是好的)区别是,它允许你用几乎任何字符来命名你的方法。
您列举的不是“标点符号”,而是简单明了的方法,因此它们的行为因对象而异(尽管存在一些约定)。
例如,查看Scaladoc文档中的List,您将看到这里提到的一些方法。
请记住以下几点:
大多数情况下,A操作符+= B组合转换为A = A操作符B,如||=或++=示例。 以:结尾的方法是右结合的,这意味着A:: B实际上是B.::(A)。
您可以通过浏览Scala文档找到大部分答案。在这里保留一个参考将重复工作,并且它将很快落后:)
这里有很好的详尽的答案。
对我来说,关键的一点是,这有两类
op提到的符号是scala sdk中的函数名。在scala中,使用这些字符(包括unicode字符)来编写函数名是合法的。这将是一个很长的列表,试图从sdk中提到所有已经在其他答案中提到的问题
还有一些符号不是函数名,而是语言语法本身的一部分,如=>,_或操作符,如&&,||等。