变量:

Scala在定义一个变量时,必须在其变量名前添加关键字“var”或“val”这两者的区别是“var”修饰的变量可以新赋值,并把原值抛弃,而用了“val”修饰的变量,则被禁止重新赋值。前者在定义后只可以修改,而后者是只能读不能写的变量。

在定义变量时,Scala推荐的变量名命名方式是“驼峰命名法”,每个单词的首字母大写,变量名和函数名以小写字母开头,类、对象和特质以大写字母开头。首次定义变量时就要给予具体的值来初始化。

在“var”类型重新赋值时,新值和旧值是同一类型,否则就会发生类型匹配错误

由于Scala是函数式编程,函数式编程的思想之一就是传入函数的参数不应该被改变,所以Scala提倡建议val型变量。

函数:

Scala的函数定义以“def”开头,然后是一个自定义的函数名(推荐驼峰命名法),接着是用圆括号“( )”包起来的参数列表。在参数列表里,多个参数用逗号隔开,并且每个参数名后面要紧跟一个冒号以及显式声明的参数类型,因为编译器在编译期间无法推断出入参类型。写完参数列表后,应该紧跟一个冒号,再添加函数返回结果的类型。最后,再写一个等号“=”,等号后面是用花括号“{ }”包起来的函数体。例如:

用“def”开始函数定义

       | 函数名|   |  参数及参数类型|   |        |   函数返回结果的类型|   |        |          |  等号|   |        |          |   |def max(x: Int, y: Int): Int = {if(x > y)xelse  |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了。

https://blog.csdn.net/stanary/article/details/99679407​blog.csdn.net

明显调用的表达式前的括号必须具有函数类型_Chisel(二) Scala语法 变量与函数...相关推荐

  1. VS报错 明显调用的表达式前的括号必须具有(指针)函数类型的一种 超简单改正方法

    背景:用VS编写代码时报了没见过的bug----明显调用的表达式前的括号必须具有(指针)函数类型 解决办法:检查括号内内容是否正确,不是函数的成员,不要加() 例我的错为:message->se ...

  2. 明显调用的表达式前的括号必须具有指针函数类型_基于指针对象的方法

    " 本文来源于<The Go Programming Language>" 6.2. 基于指针对象的方法 当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要 ...

  3. 明显调用的表达式前的括号必须具有指针函数类型_每天三分钟带你搞懂C++基础Day5 处理类型 typedef、auto、decltype...

    类型别名(type alias)一个名字,是某种类型的同义词.使用类型名有很多好处,能让复杂的类型名字变得简单明了,易于理解和使用. 有两种方法可用于定义类型别名.传统的方法是使用关键字typedef ...

  4. php 调用变量方法名,php中引用(变量和函数名前加符号)用法

    本文章来给大家介绍在php中我们常看到在在php变量前面加个&符号,这个就是php中引用符号了,它可以用于各种变量.函数.对象了下面我来给各位详细介绍php&符号用法.在 PHP 中引 ...

  5. 数据结构算法——判断表达式中的括号是否匹配

    元旦三天假,闲着没事干,就想着复习一下学数据结构时的那些算法吧.本来是想用C语言来写的,无奈啊,三四年没用C了,基本上忘光光,还是用C#来写吧,而且.Net基类库中已经有了栈.队列等的实现,直接拿来用 ...

  6. Stack应用 - 数学表达式(Balanced parentheses)括号完全匹配

    概念 数学表达式常常包含括号,如何确保正确的括号嵌套,有很多算法可以实现.今天介绍一种较为简单的算法,主要用到Python中Stack(堆栈)的概念. 实用list基础数据类型实现栈.众所周知,栈的主 ...

  7. c语言 malloc前的括号,20. 有效的括号(LeetCode)——C语言及JS实现

    问题描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 思 ...

  8. JavaScript中的load事件的作用_史上最全的web前端面试题汇总及答案JavaScript之二(二)...

    作者:樱桃小丸子儿 链接:https://www.jianshu.com/p/abadcc84e2a4 JavaScript JS的基本数据类型 number,string,boolean,objec ...

  9. javascript array添加图片_史上最全的web前端面试题汇总及答案JavaScript之二(二)...

    作者:樱桃小丸子儿 链接:https://www.jianshu.com/p/abadcc84e2a4 JavaScript JS的基本数据类型 number,string,boolean,objec ...

最新文章

  1. usaco Telecowmunication(网络流)
  2. STM32输入捕获模式设置并用DMA接收数据
  3. 文娱倍受青睐,可是网文为啥不香了?
  4. boost::diagnostic_information_what的用法程序
  5. dw指向html的根路径,dreamweaver中绝对、文档相对和站点根目录相对路径区分
  6. Syntax error, parameterized types are only available if source level is 1.5
  7. 109_Power Pivot客户ABC(帕累托)分析度量值写法(非计算列)
  8. 用Mediator Pattern + Queue 解决 订单处理流程
  9. 去除移动端alert/confirm的网址(url)
  10. 计算机终端保密检查系统使用教程,博智计算机终端保密检查系统
  11. 无线ap上网设置教程
  12. 摇滚bono_摇滚,Paper弹枪对尼古拉斯·弗朗西斯的采访
  13. 艾欧尼亚服务器延迟正常吗,lol延迟和服务器位置有关系?为什么我的lol延迟这么高?...
  14. UDS 0x22服务 DID增加流程
  15. JVM - 双亲委派机制的优势和劣势
  16. echarts 自定义legend 初始化为灰色
  17. swing-组件tooltip测试及美化
  18. 万变不离其宗之ZYNQ串口介绍
  19. JVM速补知识,还不来抱大腿!
  20. 北京两男子开黑客论坛提供教程,涉嫌非法利用信息网络罪被抓

热门文章

  1. 用python实现时间的动态(动态时钟)+ 算出某年某月星期几的所有日期
  2. 如何正确的检测对象类型?
  3. lunix下的redis数据库操作——list列表
  4. boost::timer库使用
  5. 2.1 linux C 进程与多线程入门--(1)进程和程序的区别
  6. 阿里巴巴Java开发手册——速读记录
  7. php 验证码需开启gd2
  8. C++中的数组与指针
  9. html5学习之路_003
  10. 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统(附源码+视频教程(第6节))...