program story

Unit과 Nothing의 차이점은 무엇입니까?

inputbox 2021. 1. 7. 07:55
반응형

Unit과 Nothing의 차이점은 무엇입니까?


두 유형 UnitNothing아무것도 반환하지 않는 함수를 나타냅니다. 그들 사이의 차이점은 무엇입니까?


Unit정확히 하나의 값을 가진 유형 입니다. 단위 유형을 참조하세요 . 반면에 가능한Nothing없습니다 . 하단 유형을 참조하세요 .

아무것도 반환하지 않는 함수에는 반환 유형이 있어야합니다 Unit. 그렇다면 Nothing함수는 결과를 반환 할 수 없습니다. 함수를 종료하는 유일한 방법은 예외입니다.


Nothing다른 방식으로 사용됩니다. 두 가지 속성이 특징입니다.

  1. Nothing다른 모든 유형 (포함 Null) 의 하위 유형입니다 .
  2. 이 유형의 인스턴스가 없습니다.

이것이 언제 유용합니까? 고려 None:

object None extends Option[Nothing]

때문에 Option그 형식 매개 변수의 공변이며, Nothing모든의 하위 유형 인, Option[Nothing]의 하위 유형 인 Option[A]모든 유형은 A. 그래서 우리는 모든 NoneOption[A]대한 하위 유형 인 하나의 객체 만들 수 있습니다 A. Nothing인스턴스화 할 수 없으므로 Option[Nothing]항상 값이 없기 때문에 이는 합리적 입니다. 비슷하게

object Nil extends List[Nothing]

UnitCurry-Howard isomorphismNothing 하에서 논리적 true에 해당하고 논리적 false에 해당합니다 . 여기서 유형을 명제로, 함수를 증명으로 간주합니다.


Unit즉, (a) 기능에는 입력 및 출력과 같은 부작용이 있으며, (b) 이러한 부작용은 기능의 주요 목표입니다. 물론 기능은 유형이 .NET과 다르더라도 부작용이있을 수 있습니다 Unit.

Nothing(a) 값이 없기 때문에 (Unit에는 정확히 하나의 값이 있습니다- ()), 따라서 유형의 값을 반환 할 수없고 Nothing(b) 다른 모든 유형의 하위 유형 이기 때문에 스칼라의 특수 유형입니다 . 즉, 무언가에 type이 있으면 Nothing다른 유형이 필요한 모든 곳에서 사용할 수 있지만 결과는 생성되지 않습니다. 이것은 예외를 처리하는 데 사용됩니다. throwexpression에는 유형이 Nothing있으므로 기본적으로 프로그램의 모든 곳에서 사용할 수 있습니다.

간단히 말해서 Nothing오류가 있고 아무것도 반환되지 않았 음을 Unit의미하고 부작용이 있음 의미합니다.

Scala 프로그래밍 은 그것에 대한 좋은 설명을 가지고 있습니다.


Petr의 답변에 한 가지 측면을 추가하려면 : Nothing유형 계층에서 중요한 역할을합니다. 바닥 유형입니다. 즉, Any모든 유형의 상위 유형 인의 반대와 같은 다른 모든 유형의 하위 유형임을 의미합니다 . 여기 에서 좋은 설명을 찾을 수 있습니다 .


단위

단위는 Java의 무효 와 동일 합니다. java의 void는 키워드이지만 Unit은 Kotlin의 객체입니다.

이제 함수가 Kotlin에서 Unit을 반환하면 의미있는 항목을 반환하지 않고 해당 함수가 코드를 실행 하고 실행 흐름을 반환한다는 의미입니다 .

아무것도

전혀 다른 종류는 없습니다. Java의 어떤 것과도 관련시킬 수 없습니다. Java에는 Nothing과 같은 것이 없습니다.

아무 것도 실행끝을 의미하지 않습니다 . 함수가 Nothing을 반환하면 문자 그대로 아무 것도 반환하지 않음을 의미합니다. 실행 흐름도 아닙니다 .

블랙홀과 같은 것은 없습니다. 들어오는 것은 나오지 않습니다. 빛조차도 아닙니다 (여기서 빛은 "실행 흐름"입니다). Unit의 경우 최소한의 빛이 나옵니다.

따라서 함수가 Nothing을 반환하면 코드 흐름이 거기서 끝나고 그 이후에 작성된 모든 것은 Unreachable 입니다.

이제 아래 코드를 참조하십시오.

fun main() {
    unitFun()
    println("after unit")
    nothingFun()
    println("after nothing")   //you get warning here saying "unreachable code"
}

fun nothingFun(): Nothing {
    println("inside nothing")
    throw Exception()
}

fun unitFun(): Unit {
    println("inside unit")
}

출력은

inside unit
after unit
inside nothing
Exception in thread "main" java.lang.Exception

참고 : 작성하자마자 경고가 표시됩니다.

println("after nothing")     UnReachable Code

그 이유는 nothingFun이 실행 흐름을 다시 보내지 않기 때문입니다.

여기에서이 작업을 완료하기위한 한 가지 더, Nothing을 반환하는 모든 함수는 모든 종류의 예외를 throw해야합니다.

REASON: If you write some general statement (and not throw an exception) then the function will match the return type and we don't have anything that returns Nothing, means we don't have anything that sucks the execution flow and never returns it back. Everything returns something, even Unit is something.

Now, one can say that Nothing is a class so we can make object of it and return that itself. Nohhhhhhh? A big nohhhh?

Nothing class has one constructor but it is private, so you can't even make an object of it.

Last Bit

Behind the scene, Unit is converted into void(small v) in the decompiled byte code while Nothing is converted into Void(capital V).

see the below code,

var user = null               //First
var user : User? =null        //Second

Here, the Second statement shows, user of Nullable-User type. What is the type of user of the first statement?

any guess?

It's Nullable-Nothing type.

try to see the first statement as

var user : Nothing? = null

Now what's happening under the hood,

Void user = (Void)null;              //First
User user = (User)null;        //Second

ReferenceURL : https://stackoverflow.com/questions/13539822/whats-the-difference-between-unit-and-nothing

반응형