Scala 基础(1)—— 定义变量 & 定义函数
1. 使用 val & var 定义变量
Scala 中的变量被分为2种:val 和 var。其含义于 Java 中的 final 关键字类似。
val 等同于被 final 修饰过的变量, 即一旦初始化便不可被重新赋值。
var 等同于未被 final 修饰过的变量,可以被重新赋值。
def main(args: Array[String]): Unit = {
val x = 1
x = 2 // 编译错误
}
def main(args: Array[String]): Unit = {
var x = 1
x = 2 // 编译成功
}
与 Java 相同,这里的所谓不变性,是指引用不可变但是引用对象的状态却是可变的。
object Demo {
def main(args: Array[String]): Unit = {
val a = new A(1)
a.x = 3
println(a.x)
}
}
class A(myX: Int) {
var x: Int = myX
}
以上的例子,输出结果为3。
2. 类型推断
可以看出这里有一个很明显的与 Java 不同的地方:在声明变量的时候,没有显式地给出类型
Scala 支持类型推断,就是它能够根据等式右侧的值来推断出这个参数的类型,例如上面的例子,x 的类型就是 scala.Int。
如果这并不是你所希望的 x 类型,例如,你期望初始化一个 Double 类型的,可以这么定义:
val x: Double = 1
需要注意的是,如果只希望声明变量,而不同时对变量进行初始化(一般来说这种情况只存在于定义成员变量),那么就必须显式定义类型,因为没有等式右侧去推测这个参数的实际类型。
abstract class MyClass {
val y: Int
}
3. 强调参数可变性的意义
Scala 之所以使用 val 和 var 来定义参数,主要就是为了在声明变量时,就确定它的可变性。
Scala 推荐能使用 val 的地方就是用 val,这么做的优势有:
- Scala 是一门支持函数式编程的语言,将变量定义成 val,可以有效地规避/减少函数的副作用。
- 将成员变量定义成 val,可以保证构造的对象是不可变对象,这个性质在多线程编程中很有用。
关于不可变对象,可以参考《Java 并发编程实战》P38(因为 Scala 是运行在 JVM 平台上的,编译之后本质其实就是 Java 的字节码文件)
当满足以下条件时,独享才是不可变的:
- 对象创建以后其状态就不能改变。
- 对象的所有域都是 final 类型的。
- 对象是正确创建的(在对象创建期间,this 引用没有溢出)。
4. 使用 def 定义函数
我们观察以下函数的定义:
def max(x: Int, y: Int): Int = {
if (x > y) x else y
}
定义一个函数包括以下部分:
- def -> 定义函数的关键字
- max -> 函数名
- x: Int, y: Int -> 参数列表
- Int -> 函数的结果类型
- if (x > y) x else y -> 函数体
5. 函数的结果类型
由于 Scala 的类型推断机制,函数的结果类型是可以省略的,也就是说没这么定义函数也是可行的:
def max(x: Int, y: Int) = {
if (x > y) x else y
}
但是,有一种例外,就是递归地函数,必须给出结果类型:
def factorial(x: Int) = {
require(x >= 0)
if (x > 1) x * factorial(x - 1) else 1 // 编译错误
}
虽然如此,但是一般推荐所有可以被外部访问的函数(等价于 Java 中的 public),都显式地加上结果类型。
在上面 main 函数的例子中,结果类型 Unit 等价于 Java 中的 Void,表示函数并不会返回有实际意义的结果。
Scala 基础(1)—— 定义变量 & 定义函数的更多相关文章
- 【scala】定义变量和函数
1.定义变量 Scala的变量分为两种,val和var. val跟java的final变量类似,一旦初始化就不能被重新赋值. var类似于java的非final变量,在整个生命周期内var可以被重新赋 ...
- scala基础语法(变量,数据类型,函数)
一:常量与变量 1.常量 2.两种变量定义方式(严格与不严格) 3.Float注意点 3.注意点 变量名后加上: 类型首字母是大写 4.占位符_ 但是需要制定类型 5.scala数据类型 6.其他类型 ...
- 『忘了再学』Shell基础 — 11、变量定义的规则和分类
目录 1.定义变量的规则 2.变量的分类 1.定义变量的规则 在定义变量时,有一些规则需要遵守 变量名称可以由字母.数字和下划线组成,但是不能以数字开头.如果变量名是2name则是错误的. 在Bash ...
- spark快速开发之scala基础之5高阶函数,偏函数,闭包
高阶函数 高阶函数就是将函数作为参数或者返回值的函数. object function { def main(args: Array[String]): Unit = { println(test(f ...
- SQL基础系列(3)-变量、函数、存储过程等
1. 变量 定义变量 DECLARE @a INT 赋值 PRINT @a ) --select 赋值 SELECT @name='zcx' PRINT @name SELECT @name=F ...
- GO语言-基础语法:变量定义
package main import ( "fmt" ) //不在函数内的变量,属于包内的变量.不能使用":="进行定义和赋值 var ( bb = cc = ...
- Kotlin基础语法:变量、函数、类、枚举、控制流
一切都需要从基础学起! 前言: 在Kotlin语言中,没有分号的概念了,也就是每一行代码,都不在需要用分号结束了 点击查看代码 定义 常量:val --相当于java当中的final 变量:var 关 ...
- Scala基础篇-01变量,数据类型
一.Scala变量 共有3种变量修饰符: val: 可变 var: 不可变 lazy val: 第一次应用时才计算 二.Scala的数据类型 1)类型不匹配:高精度数值赋给低精度数据类型. 2)Uni ...
- css中定义变量
css中定义变量 定义变量可分多种情况: 1.定义全局变量 :root { --borderColor: #ccc;} 2.定义某元素下的变量 .look{ --borderColor: #ccc;} ...
随机推荐
- 洛谷 P3372 线段树1
这是一道模板题 线段树介绍https://www.cnblogs.com/nvwang123/p/10420832.html #include<bits/stdc++.h> using n ...
- selenium破解极限
一共分为两端段代码: 第一段:获取cookie 第二段:通过cookie登陆 这里以百度云为例: 第一部分:保存cookies,直接在cmd中执行就好 >>> from seleni ...
- kivy学习二:做一个查询所在地区身份证前6位的小软件
经过半个月的尝试,终于成功,记录下来备查! 做完之后发现有很多的问题没有解决,请大佬多批评指教! 强烈建议:学习KIVY的查看官方文档 需要用的知识: 1.字典的相关知识 2.kivy的下拉列表(Dr ...
- idea debug启动项目慢或者启动不了
使用debug无法启动项目但是使用run就可以启动程序,而且启动比以前的debug模式快的多 原因: 启动不了的原因是在项目中的方法上打了断点,导致项目无法继续编译 取消方法断点就可以了 在idea官 ...
- 理解线程3 c语言示例线程基本操作
Table of Contents 1. 基本线程的动作 1.1. 设置线程属性 1.1.1. 设置脱离状态 1.1.2. 设置调度属性 1.2. 取消线程 1.3. 主线程创建多个线程示例 2. 了 ...
- issubclasss/type/isinstance/callable/super
issubclass() : 方法用于判断第一个参数是否是第二个参数的子子孙孙类. 语法:issubclass(sub, super) 检查sub类是否是 super 类的派生类 class A: p ...
- 4-linux基本命令
1. cd命令 cd 回当前用户 家目录 cd /home 进入home目录 (绝对路径) (相对路径) cd – 上一目录和当前目录来回切换(主要用于返回上一目录) cd . ...
- Django笔记 —— MySQL安装
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- 【Luogu P2257】YY 的 GCD
题目 求: \[ \sum_{i = 1}^n \sum_{j = 1}^m [\gcd(i, j) \in \mathbb P] \] 有 \(T\) 组数据, \(T\le 10^4, n, m\ ...
- Python学习1,代码
看了好久的网上视频,今天尝试着写了一串代码: _author_ = "Happyboy" produce_list = [ ('Iphone',5800), ('Mac Pro ...