Scala的传值调用与传名调用理解

简介: Scala的传值调用与传名调用理解

通常 函数/方法 的参数是传值参数,也就是说,参数的值在传递给函数之前已经确定好了。而在Scala中,方法或函数的参数可以是一个表达式,也就是可以将一个代码逻辑传递给某个方法或着函数。(这有点像C语言)

分别有两种调用方式:

1.Scala的传值调用(call-by-value),参数是一个或多个类型的变量


2.Scala的传名调用(call-by-name),参数传的是函数/方法名,即函数/方法(一段逻辑)


二话不说,直接上一个代码(课程Demo)来说明:

object CallByNameAndValue {
  //钱包总金额
  var money=100
  //每次扣5元
  def huaQian():Unit={
    money=money-5
  }
  //数数每次扣完剩多少钱
  def shuQian():Int={
    huaQian()  //调用方法
    money     //返回值
  }
//方法printByValue的参数是一个Int类型的变量
  def printByValue(x:Int)={
    for (a<- 0 until 3) { //0,1,2
      println(s"测试: ${x}元")
    }
  }
  //方法printByName的参数是一个无参,返回值为Int类型的函数(x: => Int 表示的是一个方法的签名)
  def printByName(x: => Int)={
    for(b<- 0 to 3) {  //0,1,2,3
      println(s"每次都算算还剩: ${x}元")//该方法无返回值,直接在方法体输出结果
    }
  }
    def main(args: Array[String]): Unit = {
    // 传值调用:传给方法的是一个确定的值
    printByValue(shuQian()) //传入的是shuQian()计算后返回的一个确定值
    // 传名调用:传的是一段逻辑
    // 将shuQian方法名称传递到printByName方法的内部执行
    printByName(shuQian())
  }
}

结果:

//传值调用
测试: 95元
测试: 95元
测试: 95元
//传名调用
每次都算算还剩: 95元
每次都算算还剩: 90元
每次都算算还剩: 85元
每次都算算还剩: 80元

再看一个:

object Calculate {
  //add方法有3个参数:第1个参数是拥有两个Int类型参数、返回值为Int的函数
  //该方法的返回值为Int
  def add(f:(Int,Int)=>Int,a:Int,b:Int):Int={
    f(a,b)   //方法体功能是调用这个带参函数变量,传入方法参数变量
  }
  //定义一个函数,有2个Int类型参数,且返回值为参数相乘结果
  val fa:(Int,Int)=>Int=(a,b)=>a*b
  //add1方法有2个参数:第一个参数是拥有一个Int类型、返回值为Int的函数
  //可以不写返回值类型,编译器可自动推测
  def add1(c:Int =>Int,d:Int)={
    c(d)*d  //方法功能是调用函数变量,传入方法参数并与参数相乘
  }
  //定义一个拥有1个参数的函数
  // val c:Int=>Int=e=>e*5
  val c=(e:Int)=>e*5
  def main(args: Array[String]): Unit = {
    //调用add方法
    val res1=add(fa,2,3) //f(2,3)-> 2*3=6
    println(res1)
    //调用add1方法
    val res2=add1(c,3) //c(3)*c -> 3*5*3=45
    println(res2)
  }
}

总结:函数可以作为一个方法的参数进行传递。

相关文章
|
分布式计算 Java Scala
本地模式下(local),java连接spark调用scala语言打成的jar包
本地模式下(local),java连接spark调用scala语言打成的jar包 一,环境构建 1、spark版本 2、Scala语言打成的jar,因为Scala和java都是运行在jvm上的字节码类语言,java可以直接调用。
2882 0
|
分布式计算 Scala Spark
本地windows跑Scala程序调用Spark
应用场景 spark是用scala写的一种极其强悍的计算工具,spark内存计算,提供了图计算,流式计算,机器学习,即时查询等十分方便的工具,所以利用scala来进行spark编程是十分必要的,下面简单书写一个spark连接mysql读取信息的例子。
1616 0
|
Java Scala 自然语言处理
13.11 Scala混用Java的集合类调用scala的foreach遍历问题
13.11 Scala混用Java的集合类调用scala的foreach遍历问题 问题描述 [ERROR] /Users/jack/book/lightsword/src/main/scala/com/springboot/in/action/service/LightSwordUserDetailService.
1056 0
|
Java Scala 自然语言处理
Scala混用Java的集合类调用scala的foreach遍历问题
问题描述 [ERROR] /Users/jack/book/lightsword/src/main/scala/com/springboot/in/action/service/LightSwordUserDetailService.
1100 0
|
Java Scala Python
scala调用java的方法,返回了一个对象链表List<Student>,在scala中遍历该链表获取指定Student的名字name
假设Student类如下: class Student { private int no; private String name; public int getNo() { return no; } public String getName() { return n...
1567 0
|
2月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
75 5
|
2月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
56 3