Scala语法有很多符号。由于使用搜索引擎很难找到这些类型的名字,所以一个全面的列表将会很有帮助。

Scala中所有的符号都是什么,每个符号都有什么作用?

特别地,我想知道 ->, ||=, ++=, <=, _._,::,和:+=。


当前回答

这里有很好的详尽的答案。

对我来说,关键的一点是,这有两类

op提到的符号是scala sdk中的函数名。在scala中,使用这些字符(包括unicode字符)来编写函数名是合法的。这将是一个很长的列表,试图从sdk中提到所有已经在其他答案中提到的问题

还有一些符号不是函数名,而是语言语法本身的一部分,如=>,_或操作符,如&&,||等。

其他回答

我认为现代IDE对于理解大型scala项目至关重要。由于这些操作符也是方法,在intellij思想中,我只是控制-单击或控制-b进入定义。

你可以右键点击一个cons操作符(::),然后在scala javadoc中说“在这个列表的开头添加一个元素”。在用户定义的操作符中,这一点变得更加关键,因为它们可能被定义为很难找到的隐式…你的IDE知道隐式的定义在哪里。

作为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中提到所有已经在其他答案中提到的问题

还有一些符号不是函数名,而是语言语法本身的一部分,如=>,_或操作符,如&&,||等。