What is the purpose of Unit-returning in functions

前端 未结 3 1984
轮回少年
轮回少年 2020-12-05 09:20

From the Kotlin documentation:

If a function does not return any useful value, its return type is Unit. Unit is a type with only one value — Unit.VALUE. This value d

相关标签:
3条回答
  • 2020-12-05 09:41

    UNIT actually contains valuable information, it basically just means "DONE". It just returns the information to the caller, that the method has been finished. This is a real piece of information so it can be seen as the return value of a method.

    0 讨论(0)
  • 2020-12-05 09:51

    The purpose is the same as C's or Java's void. Only Unit is a proper type, so it can be passed as a generic argument etc.

    1. Why we don't call it "Void": because the word "void" means "nothing", and there's another type, Nothing, that means just "no value at all", i.e. the computation did not complete normally (looped forever or threw an exception). We could not afford the clash of meanings.

    2. Why Unit has a value (i.e. is not the same as Nothing): because generic code can work smoothly then. If you pass Unit for a generic parameter T, the code written for any T will expect an object, and there must be an object, the sole value of Unit.

    3. How to access that value of Unit: since it's a singleton object, just say Unit

    0 讨论(0)
  • 2020-12-05 09:53

    The main reason why Unit exists is because of Generic reasons. Let's use the example from the Kotlin docs.

    class Box<T>(t: T) {
        var value = t
    }
    

    We can have

    var box = Box(Unit)
    

    This is why Unit returns a value so the Kotlin can infer it from the type passed into class initialization. Of course, you could also explicitly write it like this,

    var box = Box<Unit>(Unit)
    

    but all the same, it must have a return value. Now, the void keyword in Java in Kotlin is Nothing. Nothing is the last but one type in the type hierarchy in Kotlin with the last one being Nothing? (Nullable Nothing). This does not return any value at all. Because it doesn't return any value at all, we can't pass it as a type in the above code.

    var box = Box(Nothing) //This will return an Error
    
    0 讨论(0)
提交回复
热议问题