scala读书学习笔记004

1、由于scala包和java.lang包的所有成员在Scala源文件中都已自动引入,可以在任何地方使用简单名称。


2、Scala并不支持八进制字面量和以0开头的整数字面量。


3、Scala的shell总是以十进制打印整数值,不论用哪种形式来初始化。


4、字符字面量(character literal)由一对单引号和中间的任意Unicode字符组成,除了显式地给出原字符,也可以用字符的Unicode码来表示。具体写法是\u加上Unicode码对应的四位的十六进制数字。


5、字符串字面量由双引号包起来的字符组成。


6、Scala支持一种特殊的语法来表示原生字符串(raw string)。可以用三个双引号(""")开始并以三个双引号(""")结束来表示原生字符串。


7、符号字面量(symbol literal)的写法是'ident,其中ident可以是任何由字母和数字组成的标识符。这样的字面量会被映射成scala.Symbol这个预定义类的实例。确切地说,字面量'cymbal会被编译器展开成一个工厂方法的调用:Symbol("cymbal")。符号字面量通常用在那些在动态类型语言中用来当作标识符的场合。


8、Scala包括了一个灵活的机制来支持字符串插值,允许你在字符串字面量中嵌入表达式。表达式s"Hello, $name!"是一个被处理的(processed)字符串字面量。由于字母s出现在首个双引号前,Scala将使用s这个字符串插值器来处理该字面量。s插值器会对内嵌的每个表达式求值,对求值结果调用toString,替换掉字面量中的那些表达式。


9、美元符($)开始一个表达式。对于那些单变量的表达式,通常可以在美元符后面直接给出变量的名字。Scala将把从美元符开始到首个非标识符字符的部分作为表达式。如果表达式包含了非标识符字符,就必须将它放在花括号中,左花括号需要紧跟美元符。f字符串插值器允许你给内嵌的表达式加上printf风格的指令,Scala默认还提供了另外两种字符串插值器:raw和f。raw字符串插值器的行为跟s类似,不过它并不识别字符转义序列。在Scala中,字符串插值是通过在编译期重写代码来实现的。编译器会将任何由——某个标识符紧接着字符串字面量的(左)双引号这样的表达式——当作字符串插值器表达式处理。Int包含了多个重载(overloaded)的+方法,分别接收不同的参数类型。


10、任何方法都可以是操作符,在Scala中,操作符并不是特殊的语法,任何方法都可以是操作符。当你写下“s.indexOf('o')”时,indexOf并不是操作符;但当你写下“s indexOf 'o'”时,indexOf就是操作符了,因为你用的是操作符表示法。唯一能被用作前缀操作符的是+、-、!和~后缀操作符是那些不接收参数并且在调用时没有用英文句点圆括号的方法。在Scala中,可以在方法调用时省去空的圆括号。


11、在Java中,可以用==来比较基本类型和引用类型。对基本类型而言,Java的==比较的是值的相等性,就跟Scala一样。但是对于引用类型,Java的==比较的是引用相等性(reference equality),意思是两个变量指向JVM的堆上的同一个对象。Scala也提供了用于比较引用相等性的机制,即名为eq的方法。不过,eq和跟它对应的ne只对那些直接映射到Java对象的对象有效。

12、Scala的辅助构造方法以def this(...)开始。在Scala中,每个辅助构造方法都必须首先调用同一个类的另一个构造方法。换句话说,Scala每个辅助构造方法的第一条语句都必须是这样的形式:“this(...)”。被调用的这个构造方法要么是主构造方法,要么是另一个出现在发起调用的构造方法之前的另一个辅助构造方法。这个规则的净效应是Scala的每个构造方法最终都会调用到该类的主构造方法。这样一来,主构造方法就是类的单一入口。

13、在常量命名上,Scala的习惯跟Java不同。在Scala中,常量(constant)这个词并不仅仅意味着val。虽然val在初始化之后确实不会变,但它仍然是个变量。举例来说,方法参数是val,但方法每次被调用时,这些val都可以拿到不一样的值。Scala有另外一种方式来解决这个问题:可以创建一个隐式转换(implicit conversion),在需要时自动将整数转换成有理数。

14、Scala所有的控制结构都返回某种值作为结果。Scala的if可以有返回值。Scala更进一步让for、try和match也都有返回值。

15、while和do-while这样的语法结构,我们称为“循环”而不是表达式,因为它们并不会返回一个有意义的值。返回值的类型是Unit。实际上存在这样一个(也是唯一的一个)类型为Unit的值,这个值叫作单元值(unit value),写作()。


16、for子句yield代码体
yield关键字必须出现在整个代码体之前。哪怕代码体是由花括号包起来的,也要将yield放在花括号之前,而不是在代码块最后一个表达式前面。
虽然到目前为止所有示例都是对遍历到的值进行操作然后忘掉它们,也完全可以在每次迭代中生成一个可以被记住的值。具体做法是在for表达式的代码体之前加上关键字yield。通过“file<- filesHere”这样的生成器(generator)语法,我们将遍历filesHere的元素。


17、scala并不要求你捕获受检异常(checked exception)或在throws子句里声明。可以选择用@throws注解来声明一个throws子句,但这并不是必需的。


18、任何常量、字符串等都可以用作样例,而不仅限于Java的case语句支持的整型、枚举和字符串常量。在示例7.14中,可选项是字符串。另一个区别是在每个可选项的最后并没有break。在Scala中break是隐含的,并不会出现某个可选项执行完继续执行下一个可选项的情况。不过Scala的match表达式跟Java的switch相比最显著的不同,在于match表达式会返回值。


19、不过Scala的match表达式跟Java的switch相比最显著的不同,在于match表达式会返回值。


20、scala允许你在嵌套的作用域内定义同名的变量。所以如果你是Java程序员,最好至少是快速地扫一遍本节的内容。Scala程序的变量在声明时附带了一个规定在哪里能使用这个名称的作用域(scope)。关于作用域最常见的例子是花括号一般都会引入一个新的作用域,因此任何在花括号中定义的元素都会在右花括号之后离开作用域。


21、定义函数最常用的方式是作为某个对象的成员,这样的函数被称为方法(method)。


22、Scala支持一等函数。不仅可以定义函数并调用它们,还可以用匿名的字面量来编写函数并将它们作为值(value)进行传递。


23、函数字面量被编译成类,并在运行时实例化成函数值(function value)。[2]因此,函数字面量和函数值的区别在于,函数字面量存在于源码,而函数值以对象形式存在于运行时。这跟类(源码)与对象(运行时)的区别很相似。


24、 + _将会展开成一个接收两个参数的函数字面量。这就是为什么只有当每个参数在函数字面量中出现不多不少正好一次的时候才能使用这样的精简写法。多个下画线意味着多个参数,而不是对单个参数的重复使用。第一个下画线代表第一个参数,第二个下画线代表第二个参数,第三个下画线代表第三个参数,以此类推。

25、行时从任何带有自由变量的函数字面量,比如(x: Int) => x + more,创建的函数值,按照定义,要求捕获到它的自由变量more的绑定。相应的函数值结果(包含指向被捕获的more变量的引用)就被称作闭包,因为函数值是通过闭合这个开放语(open term)的动作产生的。

26、Scala允许你标识出函数的最后一个参数可以被重复。这让我们可以对函数传入一个可变长度的参数列表。要表示这样一个重复参数,需要在参数的类型之后加上一个星号(*)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值