Kotlin:为什么在构造函数中将字段定义为“var”/“val”?

时间:2018-04-07 22:03:29

标签: syntax compiler-errors compilation kotlin syntax-error

这是一个错误:

class Apple(weightInGrams: Float){
    fun grow() {
        weightInGrams+= 2.0f
    }
}

3 个答案:

答案 0 :(得分:4)

首先,相当于void(在Java中)是Unit(在Kotlin中),并且函数返回的类型在最后,所以你应该使用fun grow(): Unit { ... }而不是fun void grow() { ... }。此外,您可以省略Unit并只编写fun grow() { ... },因为编译器知道您的函数没有返回任何有意义的值。

现在,我将尝试解释基本知识以回答您的问题并给您一些清晰度。在Java中,构造函数的参数仅在该构造函数中可见。在Kotlin中,参数仅在初始化程序块和属性初始化程序中可见,除非您将它们转换为属性。让我们用例子来解释这一切。

在Java中,我们多次看到这样的类中的构造函数:

public class Person {
    public final String name;
    public final Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

参数用于初始化类Person的字段。

在Kotlin,相当于:

a)使用初始化程序块中的参数。

class Person(name: String, age: Int) {
    val name: String
    val age: Int

    init {
        this.name = name
        this.age = age
    }
}

b)使用在类体中声明的属性初始值设定项中的参数。

class Person(name: String, age: Int) {
    val name = name
    val age = age
}

c)声明属性并直接在主构造函数中初始化它们。

class Person(val name: String, val age: Int)

因此,如果您编写varval,构造函数的参数也将属性,您可以在类中使用它们,就像您希望在函数内部grow class Apple(var weightInGrams: Float) { fun grow() { weightInGrams += 2.0f } } var一样。 1}}。

所以,你的最终代码应该是:

weightInGrams

foreach($request->customers as $id){ //Loop 1 $product ->customers()->sync([$id=>['status'=>1]],false); //$product->save(); } foreach($product->customers()->get() as $cust){ //Loop2 if (!in_array($cust->id,$request->customers)){ $product ->customers()->sync([$cust->id =>['status'=>0]],false); } } /* Not needed $product //Create new record if found ->customers() ->sync($request->customers,false); */ 因为您要多次为{!! Form::open(['route' => ['route.name', $user->id]]) !!}分配一个值。

答案 1 :(得分:0)

使您的财产成为集体成员

class Apple(var weightInGrams: Float){
    fun void grow() {
        weightInGrams+= 2.0f
    }
}

答案 2 :(得分:0)

我知道这个问题已经回答了。

如果要使用initialWeight初始化苹果,可以按照以下方式执行。 init块可以帮助初始化值,grow函数可以有效地处理实际变量,而无需将构造函数变量声明为var

class Apple(initWeight: Float){
    var weightInGrams = 0.0f
    init {
        var weightInGrams = initWeight
    }
    fun grow() {
        weightInGrams+= 2.0f
    }
}
fun main(args: Array<String>) {
    val a  = Apple(10.0f)
    a.grow()
    println(a.weightInGrams)
};