在Scala中按名称调用与按值调用

Scala按名称调用vs按值调用

Scala方法是具有名称的代码块,可以接受来自调用该方法的代码中的变量。

语法:

    def method_name (parameter_list){
	    // 码 
    }

方法接受的变量称为参数。将参数传递给方法的方式称为参数传递。

Scala中参数传递的方法

在Scala中,有两种方法可以在调用方法时传递参数:

  1. 按值致电

  2. 用名字打电话

1)按值致电

Scala中传递参数的按值调用方法中-将副本传递给该方法。这意味着传递给方法的参数与实际值无关。这些参数称为形式参数。形式参数中所做的更改不会反映在实际参数中(调用方法时传递的值)。

声明为通过值参数传递来接受调用的方法的样本,

    def add(a:Int , b:Int){
        var sum = a + b ; 
        println("sum = " + sum);
    }

该调用将传递将复制到变量a和b的值,并且对a和b的操作将独立于传递的实际值。

程序演示一个CALL BY VALUE示例

object MyClass {
    //函数定义
    def add(x: Int){
        var sum = x + 1
        println("sum = "+sum)
    };
    
    def main(args: Array[String]) {
        var a = 34
        //函数调用        add(a)
    }
}

输出结果

sum = 35

2)按姓名致电

在scala中传递的参数的按名称调用方法还会传递变量的内存地址,而不是其值。因此,该程序将在相同的变量上工作。由于基于地址的参数传递,变量的地址将传递给将执行功能的方法。

声明接受名称参数传递的调用的方法的样本,

    def add(a: => Int , b: => Int){
        var sum = a + b; 
        println("sum = " + sum);
    }

该调用将复制所传递变量的内存地址,并且实际变量用于处理。

程序演示一个CALL BY NAME示例

object MyClass {
    def add(x: => Int){
        var sum = x + 1
        println("sum = "+sum)
    };
    
    def main(args: Array[String]) {
        var a = 34        add(a)
    }
}

输出结果

sum = 35

为什么不交换功能?

交换函数是表示在编程中使用按值调用和按名称调用的最常见示例。

在Scala中,函数的参数是val,即不可变,这意味着您无法在函数中重新初始化它们。让我们陷入一种最不容易了解差异的方法的情况。因此,创建经典程序只是为了给您带来差异。现在,考虑以下代码,该代码尝试重新初始化Scala的参数。

object MyClass {
    def add(a: => Int){
         a = x + 1
        println("sum = "+a)
    };
    
    def main(args: Array[String]) {
        var a = 34        add(a)
    }
}

输出结果

error: reassignment to val
         a = x + 1
           ^
one error found