方法命名约定

之前在学习《运算符重载》一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级。现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例。

比如下面这个例子:

class Cow {
def ^(moon: Moon) = println("Cow jumped over the moon")
} class Moon {
def ^:(cow: Cow) = println("This cow jumped over the moon too")
} val cow = new Cow
val moon = new Moon cow ^ moon
cow ^: moon

看一下执行结果:

除了以:结尾的运算符,还有一套运算符也是以其后的实例为目标的,包括一元运算符+、-、!和~。看下下面的例子:

class Sample {
def unary_+ = println("Called unary +") def unary_- = println("called unary -") def unary_! = println("called unary !") def unary_~ = println("called unary ~")
} val sample = new Sample
+sample
-sample
!sample
~sample

一元运算符+会映射成对unary_+()的调用,还有一元运算符-会映射到unary_-()等。(Scala对方法名有规定,运算符不允许放在字母、数字这样的字符后面,除非这个运算符有下划线作为前缀。也就是说,方法不能叫jumpOver:(),而可以叫jumpOver_:())

看下执行结果:

for表达式

在容器中有内置的foreach方法,只要为foreach方法提供需要的函数值即可。如果要控制循环,或者要操作多个容器,就要使用外部迭代器。看个例子:

for (i <- 1 to 3) {
print("ho ")
}

上面这个表达式我们见过多次了,它会打印“ho ho ho”这样的字符串。实际上这个表达式是如下表达式的通用语法的简写形式:

for([pattern <- generator; definition*]+; filter*)
[yield] expression

for表达式接收的参数包括一个或多个生成器(generator),0或多个定义(definition),还有0或多个过滤器(filter)。这些东西彼此以分号分隔。yield关键字是可选的,如果它存在的话,就表示让表达式返回一组值而不是一个Unit。

来看下yield的用法,下面是个例子:

val result1 = for (i <- 1 to 3)
yield i * 2 val result2 = for (i <- 1 to 3)
i * 2 println(result1)
println(result2)

执行结果如下:

然后看一下filter,比如只对偶数执行函数值:

val result1 = for (i <- 1 to 3; if i % 2 == 0)
yield i * 2 println(result1)

看看执行结果:

再来看看变量定义:

val result1 = for (i <- 1 to 3; j=i+1)
yield j * 2 println(result1)

执行结果:

最后看一下多个生成器的使用:

for (i <- 1 to 3; j <- 2 to 4)
println(i + " , " + j)

执行结果:

#########

scala学习手记38 - 方法命名约定和for表达式的更多相关文章

  1. scala学习手记20 - 方法返回类型推断

    除了推演变量的类型,scala也会推演方法的返回类型.不过这里有一处需要注意:方法返回类型的推演依赖于方法的定义方式.如果用等号"="定义方法,scala就会推演方法返回类型:否则 ...

  2. scala学习手记23 - 函数值

    scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...

  3. scala学习手记2 - scala中的循环

    先来看一段Java中的循环: for (int i = 1; i < 4; i++) { System.out.print(i + ","); } 毫无疑问,scala可以让 ...

  4. scala学习手记34 - trait方法的延迟绑定

    trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer { def write(m ...

  5. scala学习手记12 - 字段、方法和构造函数

    在上一节创建了一个scala类,如果没有更多的方法,scala类的定义还可以更简单一些,看一下下面这个CreditCard类的定义: class CreditCard(val number: Int, ...

  6. scala学习手记8 - 自适应的默认做法

    scala有一些默认做法,会让代码更简洁.更易读写,下面列出了这样几个特性: 1. 支持脚本.scala支持脚本,因此无须将所有的代码都放到类里.如果脚本可以满足需求,就将代码放到一个脚本里,无须再创 ...

  7. Scala学习手记1 - 快速体验

    又重新开始了scala的学习,因为中断了太长时间,所以这次还得从零开始.学习的过程就记录在这个博客上了. 这次学习的教程是<scala程序设计 java虚拟机多核编程实战>,我在多看上买了 ...

  8. scala学习:apply方法

    摘抄两段话: 在明确了方法调用的接收者的情况下,若方法只有一个参数时,调用的时候就可以省略点及括号.如 " to ",实际完整调用是 ".to()".但 &qu ...

  9. scala 学习笔记二 方法与函数

    1.介绍 Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法. Scala 中的方法跟 Java 的 ...

随机推荐

  1. Cocos2d-x 学习之引擎介绍

    Cocos2d-X是一个开源的移动2D游戏框架,MIT许可证下发布的.这是一个C + +cocos2d-iPhone项目的版本.cocos2d-X发展的重点是围绕cocos2d跨平台.即其实现一次编码 ...

  2. IO流入门-第十三章-File相关

    /* java.io.File 1.File和流无关,不能通过该类完成文件的读写 2.File是文件和目录路径名的抽象变现形式. */ import java.io.*; public class F ...

  3. windows7上使用docker容器

    1.安装 下载DockerToolbox,并安装. 下载地址:https://dn-dao-github-irror.daocloud.io/docker/toolbox/releases/downl ...

  4. 解决chrome在ubuntu+root模式下打不开的问题

    chrome在ubuntu root模式下打不开 双击图标,chrome打不开了: 解决办法: 查看一下打开chrome浏览器的命令是什么,右键properties 发现是chromium-brows ...

  5. Selenium 安装与卸载

    安装: 在cmd中键入pip install selenium==3.6.0(等号后面的为版本号),并点击回车,当出现Successfully installed selenium-3.6.0即表示已 ...

  6. Linux定时器 使用

    1.alarm alarm()执行后,进程将继续执行,在后期(alarm以后)的执行过程中将会在seconds秒后收到信号SIGALRM并执行其处理函数. #include <stdio.h&g ...

  7. 编程语言的介绍(Day2)

    1.什么是编程,为什么要编程? 编程==编写程序(写代码) 2.编程语言有哪些 机器语言 优点是最底层,速度最快,缺点是最复杂,开发效率最低 汇编语言 优点是比较底层,速度最快,缺点是复杂,开发效率最 ...

  8. Python(常用模块)

    模块 模块 本质上就是一个.py文件 内置模块(解释器层面) 第三方模块(Python lib文件) 自定义模块(当前路径) 模块调用,包的概念 在计算机程序的开发过程中,随着程序代码越写越多,在一个 ...

  9. 在python中打开文件显示没有权限PermissionError: [Errno 13] Permission denied:

    不多说了,我犯了低级错误 ,文件路径搞错了

  10. Spring 配置log4j和简单介绍Log4J的使用

    Log4j 是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事 件记录器.UNIX Syslog守护进程等 ...