Tiven Wang
Wang Tiven May 25, 2018
425 favorite favorites
bookmark bookmark
share share

Variables

  • var 定义一个普通的变量,可以被修改值
  • val 定义一个值,不能被修改
  • def 定义一个函数(Function)/方法(Method)
scala> def hello = "Hello"
scala> def hello(name: String) = "Hello " + name
scala> def a = scala.util.Random.nextInt  // pseudo
                                          // var a = function() {
                                          //           return new scala.util.Random().nextInt();
                                          //         }
a: Int
scala> a
res36: Int = -584487013
scala> a
res37: Int = -256963406

value, variable 声明时必须初始化值, 初始化时从变量的值推断出变量的类型, 也可以显式声明变量的类型。

val greeting: String = null
val greeting: Any = "Hello"

https://stackoverflow.com/questions/4437373/use-of-def-val-and-var-in-scala

Commonly Used Types

Scala 里不区分 primitive types 和 class types,像 int, char, long, byte 等这些 primitive types,Scala 会负责转换成他们对应的 class types 如 Int, Char, Long, Byte,这些 class types 应该是 Java 语言里的类,为了增强这些类的能力 Scala 又封装了一层如 Int -> RichInt, Char -> RichChar, String -> StringOps 等,这一层 Scala 仍然会自动转换。

例如下面我们可以理解成这样的过程 1 -> String -> StringOps -> call toInt -> return Int

scala> "1".toInt
res18: Int = 1

Arithmetic Operators and Methods

Scala 的算术操作符和 Java 或 C++ 的效果是一样的,但实际上他们都是 Methods。

val answer = 8 * 5 + 2

这个表达式本质上是调用了 RichInt class 的方法 *+,它实质上是下面表达式 8.*(5).+(2) 的缩写,这就是函数式编程(Functional Programming Style)风格了。所以在 Scala 里你可以这样调用方法

a method b // equal a.method(b)
a.method   // equal a.method()
a method   // equal a.method()

(1 to 5).map(2*)

还可以 import 某个 package 下的方法,然后直接调用

import scala.math._ // shortly: import math._

sqrt(2) // Yields 1.4142135623730951
pow(2, 4) // Yields 16.0
min(3, Pi) // Yields 3.0

The apply Method

val s = "Hello"
s(4) // Yields 'o'

s 是一个字符串不是一个函数怎么能被调用呐?其实 () 有另一种应用含义,当它不是被用在函数或方法上时,它会被认为是 apply() 函数调用,此例可写为 s.apply(4)

我们知道 Scala 里调用函数可以不用加 () ,那么对于这种 implicit parameters 调用再怎么加 () 调用呐?

"Bonjour".sorted(3)       // error: 这会被认为是传入参数地调用 sorted 方法
("Bonjour".sorted)(3)     // 应该这样
"Bonjour".sorted.apply(3) // 或这样

apply 其实是 Singleton Object 的构造函数

BigInt("1234567890")
BigInt.apply("1234567890")
BigInt("1234567890") * BigInt("112358111321")

就像 JavaScript 里的 Function 可以被 new 也可以被 call。类如函数

https://blog.matthewrathbone.com/2017/03/06/scala-object-apply-functions.html

Scala.js

Scala 怎么这样像 JavaScript 呐,也许是发明者吸取了 JavaScript 优点吧,让 Scala 更函数式编程。

References

Similar Posts

Comments

Back to Top