0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

学FPGA,慢慢来 2019-08-16 16:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

变量:

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了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • scala
    +关注

    关注

    0

    文章

    42

    浏览量

    6823
  • Chisel
    +关注

    关注

    0

    文章

    7

    浏览量

    573
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    常用变量的介绍

    extern:用在全局变量上表示该变量在其他文件中已经定义;用在函数上作用同全局变量; static:用在全局变量上,和非静态全局
    发表于 11-21 07:05

    C语言开发单片机为什么大多数都采用全局变量的形式?

    单片机的芯片资源从来都是 “精打细算” 的级别,CPU 主频普遍不高,RAM 总容量本就紧张,分给栈空间的更是少得可怜。要是像普通软件那样,依赖函数返回值传递数据、频繁用局部变量周转,一来去占用
    的头像 发表于 11-12 14:29 227次阅读
    C语言开发单片机为什么大多数都采用全局<b class='flag-5'>变量</b>的形式?

    如何将某个函数变量放在固定的地址 ?

    如题,如何将某个函数或者变量放在固定的地址?类似于__attribute__( at(绝对地址) ),用的nucleistudio ide, __attribute__( at(绝对地址) )出现警告 at属性被忽视,有类似的属性吗?
    发表于 11-07 06:07

    语法纠错和testbench的自动生成

    在编写Verilog代码时,我一般都是先在编辑器上写完,因为编辑器vscode或者notepad++可以提供语法高亮和自动补全等功能,然后用仿真器跑仿真,但是在编写过程中不可避免的会有一些语法的错误
    发表于 10-27 07:07

    PLC中Static和Temp变量的区别

    大家好,收到粉丝投稿,让博主讲下Static变量和Temp变量的区别,新入行的兄弟可能会对这两个概念不太能理解。
    的头像 发表于 09-24 14:51 922次阅读
    PLC中Static和Temp<b class='flag-5'>变量</b>的区别

    开发单片机需要学习什么?软件编程的 4 个关键层次

    ,缺一不可。 第一层是 C 语言基础语法。这是单片机编程的 “通用语言”,需熟练掌握变量(字符型、整型、浮点型)、函数(定义、调用、返回值)、流程控制(if-else、for 循环、switch),以及数组、指针的基本用法。不用
    的头像 发表于 08-25 11:32 578次阅读

    使用AURIX进行调试的过程中,如果进入某个函数的时候出现问题,是配置项的问题还是函数中的变量的问题?

    在使用AURIX进行调试的过程中,如果进入某个函数的时候出现问题,是配置项的问题还是函数中的变量的问题?
    发表于 08-11 07:17

    解锁LuatOS新世界:次开发必备的3个核心常识

    来了解LuatOS开发需要熟悉的几个常识。   一、匿名函数 在Lua代码里面,经常看到没有名字的函数。 这种函数定义之后,要么马上运行,要么作为另一个函数的返回值赋给其他
    的头像 发表于 06-23 16:08 237次阅读
    解锁LuatOS新世界:<b class='flag-5'>二</b>次开发必备的3个核心常识

    突破LuatOS开发瓶颈:三个次开发必备知识揭秘!

    。   一、匿名函数 在Lua代码里面,经常看到没有名字的函数。 这种函数定义之后,要么马上运行,要么作为另一个函数的返回值赋给其他变量,所
    的头像 发表于 06-23 15:05 255次阅读
    突破LuatOS开发瓶颈:三个<b class='flag-5'>二</b>次开发必备知识揭秘!

    基于 IAR Embedded Workbench 的自研 MCU 芯片软件函数变量内存布局优化精控方法

    函数变量指定section放置方法与操作流程,兼具过程记录与详细说明,旨在打造一份实用的参考指南,助力开发者精准掌控程序的内存分布与执行逻辑。文档涵盖从默认section表的介绍,到多种放置手段的阐释,以及实际配置示例的展示,为后续的开发工作奠定坚实基础。
    的头像 发表于 04-30 16:38 589次阅读
    基于 IAR Embedded Workbench 的自研 MCU 芯片软件<b class='flag-5'>函数</b>与<b class='flag-5'>变量</b>内存布局优化精控方法

    harmony OS NEXT-双向数据绑定MVVM以及$$语法糖介绍

    # 鸿蒙Harmony-双向数据绑定MVVM以及$$语法糖介绍 ## 1.1 双向数据绑定概念 在鸿蒙(HarmonyOS)应用开发中,双向数据改变(或双向数据绑定)是一种让数据·模型和UI组件之间
    的头像 发表于 04-29 16:52 1116次阅读

    Ansible Playbook中的变量使用技巧

    在inventory中定义的连接变量(比如ansible_ssh_user);优先级第
    的头像 发表于 04-15 10:26 675次阅读

    关于STM32 CAN通信发送函数HAL_CAN_AddTxMessage()的最后一个参数填0和定义一个变量取地址的问题求解

    问题: 关于STM32 CAN通信 发送函数 HAL_CAN_AddTxMessage()的最后一个参数填0和定义一个变量取地址的问题,如果直接传0,我实验发现 STM32F103C8T6 会出
    发表于 03-11 08:22

    C语言如何处理函数的返回值

    的那样,直接把 1234 赋值给了变量 ret? 搞懂这个问题不难,只要看下汇编代码就行。 把代码编译一下,只编译不链接,得到的就是C对应的汇编代码。 这块是 test 函数,不用管上面这些代码,如果一行一行去分析,没有汇编基础的话确实会头疼。 看下这行代码,很明显,12
    的头像 发表于 01-16 09:21 749次阅读

    如何把两个数据返回给调用函数

    函数的处理结果包含两个数据,如何把两个数据返回给调用函数? 第一种,把两个数据封装成一个结构体,函数返回结构体。 调用函数的地方同样用结构体去接收
    的头像 发表于 01-08 10:15 678次阅读