chisel(二)scala语法 函数与变量

变量:
scala在定义一个变量时,必须在其变量名前添加关键字“var”或“val”这两者的区别是“var”修饰的变量可以新赋值,并把原值抛弃,而用了“val”修饰的变量,则被禁止重新赋值。前者在定义后只可以修改,而后者是只能读不能写的变量。
在定义变量时,scala推荐的变量名命名方式是“驼峰命名法”,每个单词的首字母大写,变量名和函数名以小写字母开头,类、对象和特质以大写字母开头。首次定义变量时就要给予具体的值来初始化。
在“var”类型重新赋值时,新值和旧值是同一类型,否则就会发生类型匹配错误
由于scala是函数式编程,函数式编程的思想之一就是传入函数的参数不应该被改变,所以scala提倡建议val型变量。
函数:
scala的函数定义以“def”开头,然后是一个自定义的函数名(推荐驼峰命名法),接着是用圆括号“( )”包起来的参数列表。在参数列表里,多个参数用逗号隔开,并且每个参数名后面要紧跟一个冒号以及显式声明的参数类型,因为编译器在编译期间无法推断出入参类型。写完参数列表后,应该紧跟一个冒号,再添加函数返回结果的类型。最后,再写一个等号“=”,等号后面是用花括号“{ }”包起来的函数体。例如:
用“def”开始函数定义
       | 函数名
       |   |  参数及参数类型
       |   |        |   函数返回结果的类型
       |   |        |          |  等号
       |   |        |          |   |
      def max(x: int, y: int): int = {
        if(x > y)
          x
        else  |
          y   |
      }       |
              |
       花括号里定义函数体
---------------------
版权声明:本文为csdn博主「_ichthyosaur」的原创文章,遵循cc 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34291505/article/details/86750352
在scala的代码里,句末的分号是可选的,但是如果一行有多条语句,则必须用分号隔开;如果一行只有一条完整语句,那么这个分号可以写也可以不写。函数的“return”关键字也是可选的,建议不要显式声明“return”。返回结果有一个特殊的类型“unit”表示没有返回值,该函数没有任何可引用的返回结果。 unit类型同样可以被推断出来,但如果显式声明为unit类型的函数,则即使函数体最后有一个可以返回具体值的表达式,也不会把表达式的结果返回。
如果将函数定义在class、object、trait里面的函数,这种函数叫做“成员函数”或者“方法”
 四、函数字面量
函数式编程有两个主要思想,其中之一就是:函数是一等(first-class)的值。换句话说,一个函数的地位与一个int值、一个string值等等,是一样的。既然一个int值可以成为函数的参数、函数的返回值、定义在函数体里、存储在变量里,那么,作为地位相同的函数,也可以这样。你可以把一个函数当参数传递给另一个函数,也可以让一个函数返回一个函数,亦可以把函数赋给一个变量,又或者像定义一个值那样在函数里定义别的函数(即前述的嵌套函数)。就像写一个整数字面量“1”那样,scala也可以定义函数的字面量。函数字面量是一种匿名函数的形式,它可以存储在变量里、成为函数参数或者当作函数返回值,其定义形式为:
(参数1: 参数1类型, 参数2: 参数2类型, ...) => { 函数体 }
通常,函数字面量会赋给一个变量,这样就能通过“变量名(参数)”的形式来使用函数字面量。在参数类型可以被推断的情况下,可以省略类型,并且参数只有一个时,圆括号也可以省略。
函数字面量的形式可以更精简,即只保留函数体,并用下划线“_”作为占位符来代替参数。在参数类型不明确时,需要在下划线后面显式声明其类型。多个占位符代表多个参数,即第一个占位符是第一个参数,第二个占位符是第二个参数……因此不能重复使用某个参数。例如:
scala> val f = (_: int) + (_: int)
f: (int, int) => int = $$lambda$1072/1534177037@fb42c1c
scala> f(1, 2)
res0: int = 3
 无论是用“def”定义的函数,还是函数字面量,它们的函数体都可以把一个函数字面量作为一个返回结果,这样就成为了返回函数的函数;它们的参数变量的类型也可以是一个函数,这样调用时给的入参就可以是一个函数字面量。类型为函数的变量,其冒号后面的类型写法是“(参数1类型, 参数2类型,...) => 返回结果的类型”。例如:
scala> val add = (x: int) => { (y: int) => x + y }
add: int => (int => int) = $$lambda$1192/1767705308@55456711
scala> add(1)(10)
res0: int = 11
scala> def afunc(f: int => int) = f(1) + 1
afunc: (f: int => int)int
scala> afunc(x => x + 1)
res1: int = 3
在第一个例子中,变量add被赋予了一个返回函数的函数字面量。在调用时,第一个括号里的“1”是传递给参数x,第二个括号里的“10”是传递给参数y。如果没有第二个括号,得到的就不是11,而是“(y: int) => 1 + y”这个函数字面量。
在第二个例子中,函数afunc的参数f是一个函数,并且该函数要求是一个入参为int类型、返回结果也是int类型的函数。在调用时,给出了函数字面量“x => x + 1”。这里没有显式声明x的类型,因为可以通过f的类型来推断出x必须是一个int类型。在执行时,首先求值f(1),结合参数“1”和函数字面量,可以算出结果是2。那么,“f(1) + 1”就等于3了。

PIC12C508单片机控制灯光慢慢的变亮和变灭的程序设计
窄频低功耗网络协议 最大化物联网节点容量
华为mate9正在内部测试Android O?华为再次抢先一步,试运安卓8.0,快的飞起
Bose将在明年推出新的降噪耳机
新能源汽车有哪些_新能源汽车价格表_5万到10万的新能源汽车
chisel(二)scala语法 函数与变量
6N1电子管耳放的电源电路图
解析4680电池和21700电池
基于蒙特卡罗方法的理论
奥克斯空调多重优惠“花式”来袭 巅峰狂欢趴即将开幕
加密货币如何加密
电动车、摩托车灯方案 平均电流型LED 降压恒流驱动器 AP5218
RFID技术会是安防领域的突破口吗
新能源汽车中高电流驱动器介绍
概伦电子NanoDesigner产品的技术优势
华为手环3Pro发布 0.95英寸AMOLED触摸彩屏售价99欧元
邮轮控制系统中电容器的作用什么?
基于CDMA 1X的无线通信监控方案设计
UDS在CAN和以太网上的实现方案
efuseIP进行spice建模的实现方案