Null 병합 연산자

Null coalescing operator

null 병합 연산자(Perl에서는 논리적 정의-또는 연산자라고 함)는 C#,[1] 버전 7.0.[2]0의 PowerShell, 버전 [3]5.10의 Perl, [4]Swift PHP 7.0.[5]0을 비롯한 여러 프로그래밍 언어의 기본 조건식 구문의 일부인 이진 연산자입니다.동작은 구현에 따라 다르지만 null 병합 연산자는 일반적으로 가장 왼쪽 끝 피연산자의 결과를 반환하며, 그렇지 않으면 가장 오른쪽 피연산자의 결과를 반환합니다.이 동작에 의해, 보다 구체적인 값을 사용할 수 없는 경우에 디폴트치를 정의할 수 있습니다.

연산자가 다음과 같이 사용되는 삼원 조건과는 대조적으로 x ? x : y2진수 엘비스 연산자처럼x ?: y, null 병합 연산자는 바이너리 연산자이며, 따라서 연산자의 피연산자를 한 번에 평가합니다.이것은, 의 평가의 경우에 중요합니다.x부작용이 있다.

언어별 예

본라이크 셸

Bourne 쉘(및 파생 모델)에서는 "파라미터가 설정되지 않았거나 null일 경우 단어 확장이 대체됩니다.그렇지 않으면 파라미터 이 대체됩니다."[6]

#provided_title='provided title' # 제공된 제목을 사용하려면 이 줄의 주석을 해제합니다. 직함=${supplied_disclosed:-'기본 제목'} 메아리치다 "$140" 인쇄 수:기본 제목 

C#

C#에서 늘 머지 연산자는 다음과 같습니다.??.

표현식을 다음과 같이 단순화하는 데 가장 많이 사용됩니다.

Null 값일 수 있음 ?? 값 If Null 

예를 들어, C# 코드가 존재하지 않는 경우 페이지에 기본 제목을 부여하기 위해 몇 가지 C# 코드를 구현하는 경우 다음 문을 사용할 수 있습니다.

스트링 페이지 제목 = 공급했다제목 ?? "기본 제목"; 

좀 더 장황하게 말하는 대신

스트링 페이지 제목 = (공급했다제목 != 무효) ? 공급했다제목 : "기본 제목"; 

또는

스트링 페이지 제목;  한다면 (공급했다제목 != 무효) {     페이지 제목 = 공급했다제목; } 또 다른 {     페이지 제목 = "기본 제목"; } 

세 가지 형식을 사용하면 동일한 값이 지정된 변수에 저장됩니다.pageTitle.

주의:suppliedTitle를 사용할 때 참조되는 것은 1회뿐입니다.??연산자, 그리고 다른 두 가지 코드 예제에서는 두 번을 사용합니다.

연산자는 동일한 식에서 여러 번 사용할 수도 있습니다.

돌아가다 일부_값 ?? some_Value ?? 일부_값3; 

null 이외의 값이 번호에 할당되거나 최종 값(null 또는 null이 아닐 수도 있음)에 도달하면 식이 완료됩니다.

예를 들어 C# 8.0은 변수 값을 null로 평가한 경우 변수를 다른 값으로 변경해야 합니다.??=null 병합 할당 연산자를 사용할 수 있습니다.

일부_값 ??= some_Value; 

다음 중 더 간결한 버전은 무엇입니까?

일부_값 = 일부_값 ?? some_Value; 

null-conditional 연산자와 조합하여 ?.또는 null-conditional 요소 액세스 연산자?[]개체 또는 개체의 구성원이 null인 경우 null 병합 연산자를 사용하여 기본값을 제공할 수 있습니다.예를 들어 다음과 같은 경우 기본 제목을 반환합니다.page객체가 null 또는pagenull이 아니라 그Title속성은 다음과 같습니다.

스트링 페이지 제목 = 페이지입니다.?.제목 ?? "기본 제목"; 

CFML

ColdFusion 11,[7][8]Railo 4.1에서 CFML은 null 병합 연산자를 3진 연산자의 변형으로 지원합니다.?:위의 C#과 기능적으로 구문적으로 동등합니다.예:

possible Null Value ? : value If Null


F#

null 값은 일반적으로 값 또는 [9]변수에 대해 F#에서 사용되지 않습니다.단, 예를 들어 F# 코드가 C#에서 호출된 경우 null 값이 표시될 수 있습니다.

F#에는 내장된 null 병합 연산자가 없지만 필요에 따라 사용자 지정 [10]연산자로 정의할 수 있습니다.

허락하다 ( ?) lhs rhs = (한다면 lhs = 무효 그리고나서 rhs 또 다른 lhs) 

이 커스텀 연산자는 C#의 빌트인 늘 병합 연산자에 따라 적용할 수 있습니다.

허락하다 페이지 제목 = 공급했다제목 ? "기본 제목" 

프리마커

Apache FreeMarker에서 값이 누락되면 일반적으로 예외가 발생합니다.단,[11] missing 값과 null 값 모두 생략 가능한 기본값으로 처리할 수 있습니다.

${missing 변수!"기본값"} 

또는 출력을 공백으로 두려면:

${missing 변수!} 

하스켈

일반적으로 Haskell의 유형은 null일 수 없습니다.의미 있는 결과를 반환할 수도 있고 반환하지 않을 수도 있는 계산의 표현은 표준[12] 라이브러리에서 다음과 같이 정의된 일반적인 Maybe 유형으로 표현됩니다.

데이터. 아마도요. a = 아무 것도 없어요.   그저. a 

null 병합 연산자는 null 포인터를 기본값으로 바꿉니다.Haskell 등가는 기본값을 제공하여 Maybe에서 값을 추출하는 방법입니다.이것은 Maybe의 기능입니다.

어쩌면 :: a -> 아마도요. a -> a 어쩌면 default Value(기본값) x =   사례. x      아무 것도 없어요. -> default Value(기본값)     그저. 가치 -> 가치 

다음은 사용 예를 제시하겠습니다.

어쩌면 0 (그저. 3) -- 3을 반환합니다. 어쩌면 "" 아무 것도 없어요. -- "를 반환합니다. 

자바스크립트

JavaScript의 가장 가까운 연산자는 다음과 같습니다.??ECMAScript 11번째 [13]판에서 표준에 추가된 "nullish coalesing operator"입니다.이전 버전에서는 Babel 플러그인을 통해 TypeScript에서 사용할 수 있었습니다.왼쪽 피연산자를 평가하여 결과값이 "nullish"(늘)가 아닌 경우)null또는undefined)는 그 값을 결과로 가져옵니다.그렇지 않으면 오른쪽 오퍼랜드를 평가하여 결과값을 가져옵니다.

다음 예제에서는a값이 할당됩니다.b가치가 있다면b아니다null또는undefined그렇지 않으면 3이 할당됩니다.

컨스턴트 a = b ?? 3; 

nullish 병합 연산자 이전에는 프로그래머가 논리 OR 연산자( ). 단, 어디에??특히 를 찾습니다.null또는undefined,그 연산자는 위변조 값을 찾습니다.null,undefined,"",0,NaN,그리고 물론.false.

다음 예제에서는a값이 할당됩니다.b가치가 있다면btruthy 입니다.그렇지 않으면 3이 할당됩니다.

컨스턴트 a = b    3; 

코틀린

Kotlin은?:오퍼레이터.[14]이것은 이례적인 기호 선택이다.?:는 보통 엘비스 오퍼레이터에게 사용되며, 눌 결합은 아니지만 눌이 거짓으로 간주되는 그루비(프로그래밍 언어)에서 영감을 받았습니다.

 직함 = 공급했다제목 ?: "기본 제목" 

목표-C

Obj-C에서 제로 결합 연산자는?:. 참조가 0인 경우 기본값을 제공하기 위해 사용할 수 있습니다.

아이디 가치 = 가치 That Might Be Nil ?: 값 If Nil; 

이건 글쓰기랑 똑같아요.

아이디 가치 = 가치 That Might Be Nil ? 가치 That Might Be Nil : 값 If Nil; 

Perl(버전 5.10 이후)에서는 오퍼레이터는//동등한 Perl 코드는 다음과 같습니다.

$syslog_value // $value_if_module 

possible_null_value는 null 또는 not-null평가됩니다(Perl 용어에서는 정의되지 않았거나 정의되어 있습니다).평가에 따라 표현식은 가능한_null_value가 null일 경우 value_if_null을 반환하고 그렇지 않을 경우 가능한_null_value를 반환합니다.부작용이 없을 경우 이는 3원 연산자(?:문)가 이를 지원하는 언어로 작동하는 방식과 유사하다.위의 Perl 코드는 아래의 3진 연산자의 사용과 동일합니다.

정의되어 있다($syslog_value) ? $syslog_value : $value_if_module 

이 연산자의 가장 일반적인 용도는 단순한 null 체크에 사용되는 코드의 양을 최소화하는 것입니다.

Perl은 또한//=할당 연산자, 여기서

$a //= b달러 

는 주로 다음과 같습니다.

$a = $a // b달러 

이 연산자는 이전 Perl 연산자와 다릅니다. 그리고. =연산자는 진리가 아닌 정의성을 고려한다는 점에서 중요합니다.따라서 0 또는 " (0-length 문자열)와 같이 false이지만 정의된 값에서는 다르게 동작합니다.

$a = 0; b달러 = 1; c달러 = $a // b달러;  # $c = 0 c달러 = $a    b달러;  # $c = 1 

PHP

PHP 7은 Null-Coalesing 연산자를 도입했습니다[15].??구문을 사용합니다.이는 NULL 또는 존재하지 않는 변수/배열 인덱스/속성을 엄격하게 확인합니다.이 점에서 PHP와 비슷하게 동작합니다.isset()의사 함수:

이름 = $요구->입력[이름] ?? $요구->질문하다[이름] ?? '기본 이름';  /****에 상당합니다.  한다면 (세트($요구->입력[이름])) {     이름 = $요구->입력[이름]; } 그렇지 않으면 (세트($요구->질문하다[이름])) {     이름 = $요구->질문하다[이름]; } 또 다른 {     이름 = '기본 이름'; } 
유저 = $ this->get User(사용자 가져오기)() ?? $ this->createGuestUser 사용자();  /****에 상당합니다.  유저 = $ this->get User(사용자 가져오기)();  한다면 (무효 === 유저) {     유저 = $ this->createGuestUser 사용자(); } 
$pageTitle = $140 ?? '기본 제목';  /****에 상당합니다.  $pageTitle = 세트($140) ? $140 : '기본 제목'; 

버전 7.4의 PHP에서는 Null Collescing Assignment Operator와??=구문:[16]

// 다음 행도 같은 동작을 하고 있습니다. $ this->부탁한다->데이터.['실패']['user_id'] = $ this->부탁한다->데이터.['실패']['user_id'] ?? '값'; // 긴 이름으로 변수를 반복하는 대신 동일한 병합 연산자를 사용합니다. $ this->부탁한다->데이터.['실패']['user_id'] ??= '값'; 

파이썬

Python에는 null 병합 연산자가 없습니다.이 기능은 다음 조건식을 사용하여 모방할 수 있습니다.

지금이다() 한다면 시간을  없음. 또 다른 시간을 

Python 3.8에 null-coalesing-type 연산자를 추가하는 제안이 있었지만, [17]그 제안은 연기되었습니다.

관련 기능

파이썬의or연산자는 관련되지만 다른 동작을 제공합니다.다른 점은 말이다.or또한 첫 번째 용어가 정의되어 있지만 값이 다음과 같은 경우 오른쪽 용어를 반환합니다.False부울 컨텍스트:

42     또는 "뭔가"  #는 42를 반환한다. 0      또는 "뭔가"  #는 "something"을 반환합니다. 거짓의  또는 "뭔가"  #는 "something"을 반환합니다. ""     또는 "뭔가"  #는 "something"을 반환합니다. []     또는 "뭔가"  #는 "something"을 반환합니다. 받아쓰다() 또는 "뭔가"  #는 "something"을 반환합니다. 없음.   또는 "뭔가"  #는 "something"을 반환합니다. 

진정한 null 병합 연산자는 반환만 합니다."something"false-ish 값을 반환합니다.0,False,"",[],dict()를 참조해 주세요.

PowerShell

PowerShell 7 이후??null 병합 연산자는 이 [2]기능을 제공합니다.

$myVar = $140 x달러 = $myVar ?? "뭔가" #는 "something"을 할당합니다. 

없는 동안null녹의 경우 태그 부착 유니언은 동일한 목적으로 사용됩니다.예를들면,Result<T, E>또는Option<T>.

unwrap_or_else()는, 다른 언어의 늘 통합 연산자와 같은 목적으로 기능합니다.디폴트값 계산에 부작용이 없는 경우unwrap_or()는, 보다 간결한(최적화를 실시하지 않고, 보다 효율적인) 선택으로서 사용할 수 있습니다.

parsed_parsed:Vec <_> = [1", "숫자가 아닙니다", "3" .iter() .map ( n . n . sn . sn unwrap rap _ or _ map ( _ std : : : : i64 : MIN ) . collect ( ) ; // " - 92233720368575808 , 3 ] println ! ( { : { : { : } ) } ) , parse 

SQL

Oracle의 PL/SQL에서 NVL() 함수는 다음과 같은 결과를 제공합니다.

NVL(possible_value(가능), 'null의 경우 값'); 

SQL Server/Transact-SQL에는 동일한 프로토타입 패턴을 따르는 ISNULL 함수가 있습니다.

하지 않다(possible_value(가능), 'null의 경우 값'); 

ISNULL과 IS NULL을 혼동하지 않도록 주의해야 합니다.IS NULL은 일부 콘텐츠가 NULL로 정의되어 있는지 여부를 평가하는 역할을 합니다.

ANSI SQL-92 표준에는 Oracle,[18] SQL Server,[19] Postgre구현된 COALESCE 기능이 포함되어 있습니다.SQL,[20] SQLite[21]MySQL.[22]COALESCE 함수는 늘이 아닌 첫 번째 인수를 반환합니다.모든 항이 null이면 null을 반환합니다.

통합(possible_value(가능)[, possible_value(가능), ...]); 

재빠르다

Swift에서 제로 통합 연산자는 다음과 같습니다.??. 옵션 타입을 개봉할 때 기본값을 제공하기 위해 사용됩니다.

옵션값 ?? 값 If Nil 

예를 들어, Swift 코드가 존재하지 않는 경우 페이지에 기본 제목을 부여하기 위해 일부 Swift 코드를 구현하려는 경우 다음 문을 사용할 수 있습니다.

변화하다 공급했다제목: 스트링? = ... 변화하다 페이지 제목: 스트링 = 공급했다제목 ?? "기본 제목" 

좀 더 장황하게 말하는 대신

변화하다 페이지 제목: 스트링 = (공급했다제목 != 제로) ? 공급했다제목! : "기본 제목"; 

VB.NET

VB.NET에서는If[23] operator/module은 늘 병합 연산자 효과를 달성합니다.

어둡다 페이지 제목 = 한다면(공급했다제목, "기본 제목") 

변형을 좀 더 간결하게 사용한다면

어둡다 페이지 제목 = 한다면(공급했다제목 << 고객명 >>님 아무 것도 없어요., 공급했다제목, "기본 제목") 

「 」를 참조해 주세요.

레퍼런스

  1. ^ BillWagner. "?? Operator (C# Reference)". msdn.microsoft.com.
  2. ^ a b "PowerShell 7 Preview 5". PowerShell. 2019-10-23. Retrieved 2020-02-15.
  3. ^ "perlop - perldoc.perl.org". perldoc.perl.org.
  4. ^ "The Swift Programming Language (Swift 4): Basic Operators". developer.apple.com.
  5. ^ "PHP: News Archive - 2015". php.net.
  6. ^ "Bash man page".
  7. ^ "Elvis operator". wikidocs.adobe.com.
  8. ^ "[RAILO-2195] add support for the Elvis Operator - JBoss Issue Tracker". issues.jboss.org.
  9. ^ cartermp. "Null Values (F#)". msdn.microsoft.com.
  10. ^ cartermp. "Operator Overloading (F#)". msdn.microsoft.com.
  11. ^ "Expressions". Apache FreeMarker Manual.
  12. ^ "Hackage". Retrieved 10 July 2015.
  13. ^ "ECMAScript 2020 Language Specification". Ecma International. June 2020.
  14. ^ 를 클릭합니다"Null safety"..
  15. ^ "PHP: rfc:isset_ternary". Retrieved 16 December 2014.
  16. ^ Kocak, Midori. "PHP RFC: Null Coalescing Assignment Operator". PHP.net. Retrieved 20 July 2017.
  17. ^ "PEP 505 -- None-aware operators".
  18. ^ "Database SQL Language Reference". docs.oracle.com.
  19. ^ "COALESCE (SQL Server Compact)". technet.microsoft.com.
  20. ^ "PostgreSQL: Documentation: 9.1: Conditional Expressions". www.postgresql.org. 27 October 2016.
  21. ^ "SQLite Query Language: Core Functions". www.sqlite.org.
  22. ^ "MySQL :: MySQL 5.5 Reference Manual :: 12.3.2 Comparison Functions and Operators". dev.mysql.com.
  23. ^ dotnet-bot. "If Operator (Visual Basic)". docs.microsoft.com.