세이프 내비게이션 조작자

Safe navigation operator

개체 지향 프로그래밍에서 안전 탐색 연산자(선택적 체인 연산자, 안전 호출 연산자, null 조건 연산자라고도 함)는 첫 번째 인수가 null이면 null을 반환하는 이진 연산자, 그렇지 않으면 두 번째 인수(일반적으로 개체 멤버 액세스, 어레이 ind)로 지정된 대로 비참조 작업을 수행한다.ex 또는 람다 호출.

순차적 명시적 null 점검 및 할당을 피하고 메서드/속성 체인으로 대체하기 위해 사용된다.네비게이션 연산자(예: ".")가 null 객체에 적용될 경우 오류가 발생하는 프로그래밍 언어에서, 안전 네비게이션 연산자는 메서드/필드 체인의 평가를 중지하고 null을 체인 표현식의 값으로 반환한다.그루비[1] 1.0이 2007년 처음 사용했으며 현재 C#,[2] Swift,[3] TypeScript,[4] Ruby,[5] Kotlin,[6] Rust[7] 등의 언어로 지원되고 있다.현재 이 운영자에 대한 일반적인 명명 규칙은 없지만 안전 항법 운영자가 가장 널리 사용되는 용어다.

연산자를 사용하는 주된 장점은 파멸의 피라미드를 피한다는 것이다.여러 개의 중첩을 쓰는 대신ifs, 프로그래머는 일반적인 체인을 사용할 수 있지만, 점(또는 체인에 사용되는 다른 문자) 앞에 물음표 기호를 추가할 수 있다.

안전항법 운영자null 병합 운영자는 둘 다 null-aware 운영자지만 운영상 차이가 있다.

에이펙스

안전 항법 수술자의 예:[8]

a[x]?.a Method.().a필드 // a[x] == null인 경우 null로 평가 a[x].a Method.()?.a필드 // a[x]일 경우 null을 반환한다.aMethod()를 null로 평가한다.  종단부르 = 사용자.getProfileUrl()?.toExternalForm(); 돌아오다 [선택 이름 From 계정 어디에 아이디 = :악센트]?.이름; 

C#

C# 6.0 이상은?., 사항 조건의 회원 접속 사업자(Microsoft에 의해엘비스 운영자라고도 불리며, C#에 상당하는 엘비스 운영자라는 용어의 일반적인 용어와 혼동해서는 안 된다.??, null 병합 연산자) 및?[], 인덱서 get accessor의 null-safe 호출을 수행하는 null-contract 요소 액세스 연산자.멤버 액세스 결과 유형이 값 유형인 경우, 해당 멤버의 null 조건 액세스 결과 유형은 해당유형의 무효 버전이다.[9]

다음 예제는 기사의 배열에서 첫 번째 기사의 작성자 이름을 검색한다(각 기사에 다음과 같은 경우).Author멤버 그리고 각 작가들은Name(구성원)을 포함하면 다음과 같다.null배열대로라면null, 만약 그것의 첫번째 요소가null, 만약Author그 기사의 구성원은null, 또는 만약Name그 작가의 멤버는null.참고:IndexOutOfRangeException어레이가 비포함 상태지만 비어 있는 경우(즉, 0-길이) 여전히 던진다.

시합을 하다 이름을 붙이다 = 기사들?[0]?.작가?.이름; 

람다에게 전화하려면callback?.Invoke(), null-reason 호출이 없기 때문에 (callback?()허용되지 않음).

시합을 하다 결과 = 콜백?.호출하다(아그); 

클로저

클루쥬어에는 다른 언어가 사용한다는 의미에서 진정한 운영자가 없지만, 자바와 상호운용성이 있고, 클루쥬어가 사용했을 때 객체 내비게이션을 수행해야 하기 때문에, 클루쥬어는some->[10] 매크로를 사용하여 안전한 항해를 수행할 수 있다.

(모-> 기사 .author .name) 

커피스크립트

실존 연산자:[11]

zip =복권 추첨.드로위너?().주소를 쓰다?.우편번호 

크리스털

크리스탈은 다음을 지지한다.try안전항법

이름을 붙이다 = 기사.해보다, &저자.해보다, &이름을 붙이다 

다트

조건부 회원 접속 운영자:[13]

시합을 하다 이름을 붙이다 = 기사?.저자?.이름을 붙이다 

고수

Null 안전 호출 연산자:[14]

시합을 하다 이름을 붙이다 = 기사?.저자?.이름을 붙이다 

고수특성으로 선언된 클래스 속성에는 null-safe 호출 연산자가 필요하지 않다.

계급  {     시합을 하다 _bar:  로서  }  시합을 하다 foo:  = 무효의  // 아래는 NullPointer를 반환하지 않고 null로 평가함예외 시합을 하다 술집을 내다 = foo. 

그루비

안전 항법 운영자 및 안전 지수 운영자:[1][15]

반항하다 이름을 붙이다 = 기사?.작가들?[0].이름을 붙이다 

자바스크립트

ECMAScript 2020에 추가된 선택적 체인 연산자는 참조나 함수가 정의되지 않거나 null일 가능성이 있을 때 연결된 객체를 통해 값 접근을 단순화하는 방법을 제공한다.[16]

경시하다 이름을 붙이다 = 기사?.작가들?.[0]?.이름을 붙이다 경시하다 결과 = 콜백?.() 

그것은 그것의 오른쪽에 있는 전체 통화 사슬을 단락시킨다: 다음 예에서, 는 "접근"되지 않는다.

무효의?.foo.술집을 내다 

코틀린

안전 통화 운영자:[6]

발랄하게 하다 이름을 붙이다 = 기사?.저자?.이름을 붙이다 

목표-C

NULL로 전송될 때 기본 메시지가 아무런 부작용 없이 폐기되기 때문에 대부분의 경우 NULL을 고려하지 않고 일반 탐색 구문을 사용할 수 있다.

NSString *이름을 붙이다 = 기사.저자[0].이름을 붙이다; 

PHP

Null 금고 운영자는 PHP 8:[17]

달러명 = $기사?->저자?->이름을 붙이다; 

파이톤

Python에서는 세이프 내비게이션 운영자가 지원되지 않는다.그것은 다음과 같은 구문에 포함되도록 제안되었다.[18]

# 제안된 구문, 아직 언어의 일부가 아님: 이름을 붙이다 = 기사?.저자?.이름을 붙이다 

라쿠 (Perl 6)

안전 방법 호출:[19]

 이름 = $기사?작성자.?이름;

루비

Ruby가 지지한다.&.버전 2.3.0 이후 안전 내비게이션 운영자(외로운 운영자라고도 함):[5]

이름을 붙이다 = 기사&저자&이름을 붙이다 

녹이 서포트하다.?[7] 그리고try!{}다음을 구현하는 구조물의 운영자Try특질[20]

// 빠른 복귀의 선호되는 방법 오류 fn write_to_file_question() -> 결과<>, MyError> {let mut file = File::create("my_best_friends.txt")?; 파일.write_all(b"이것은 나의 가장 친한 친구들의 목록이야."?; Ok() } } // 빠른 복귀의 이전 방법 오류 fn write_to_file_using_try() -> 결과<), MyError> {mut file = r#try!(파일::create("my_best_friends.txt"); r#try!(파일).write_all(b "이것은 나의 가장 친한 친구들의 목록이야."); OK() }}

스칼라

스칼라의 null-safe 연산자는 Dsl.scala 라이브러리에 의해 제공된다.[21][22]

발랄하게 하다 이름을 붙이다 = 기사.?.저자.?.이름을 붙이다 : @ ? 

@ ?주석을 사용하여 무효값을 나타낼 수 있다.

케이스 계급 나무(남겨진: 나무 @ ? = 무효의, 맞다: 나무 @ ? = 무효의, 가치를 매기다:  @ ? = 무효의)  발랄하게 하다 뿌리를 내리다: 나무 @ ? = 나무(   남겨진 = 나무(     남겨진 = 나무(가치를 매기다 = "좌측"),     맞다 = 나무(가치를 매기다 = "좌우")   ),   맞다 = 나무(가치를 매기다 = "오른쪽") ) 

정상.scala는 null-safe가 아니다.null가치를 매기다

a[널포인터예외] 해야 한다 있다 버림받은 사람 { 뿌리를 내리다.맞다.남겨진.맞다.가치를 매기다 // root.right.left is null! } 

예외는 다음을 사용하여 피할 수 있다.?대신 nullable 값으로 연산자:

뿌리를 내리다.?.맞다.?.남겨진.?.가치를 매기다 해야 한다 있다(무효의) 

전체 표현은null중 한 명이라면?에 대해 수행되다null가치를 매기다

a의 경계null안전운전자?유형이 다음과 같이 주석을 달 수 있는 가장 가까운 주변 식입니다.@ ?.

("여보세요 " + ("세계" + 뿌리를 내리다.?.맞다.?.남겨진.?.가치를 매기다)) 해야 한다 있다("Hello world null") ("여보세요 " + (("세계" + 뿌리를 내리다.?.맞다.?.남겨진.?.가치를 매기다.?): @ ?)) 해야 한다 있다("Hello null") (("여보세요 " + ("세계" + 뿌리를 내리다.?.맞다.?.남겨진.?.가치를 매기다.?)): @ ?) 해야 한다 있다(무효의) 

스위프트

선택적 체인 [3]연산자, 첨자 연산자 및 통화:

하게 하다 이름을 붙이다 = 기사?.작가들?[0].이름을 붙이다 하게 하다 결과 = 프로토콜바?.선택적 필요?() 

타이프스크립트

선택적 체인 연산자는 Typecript 3.7 릴리스에 포함되었다.[4]

하게 하다 x = foo?.술집을 내다?.[0]?.야유하다(); 

Visual Basic 입니다.네트

Visual Basic 14 이상에서는?.(null-messages 멤버 액세스 운영자) 및?()(null 조건 인덱스 연산자), C#과 유사함.그들은 C#[23]의 등가 연산자와 같은 행동을 한다.

다음 문장은 위의 C# 예와 동일하게 작용한다.

어둡다 이름을 붙이다 = 기사들?(0)?.작가?.이름 

참고 항목

참조

  1. ^ a b "Support the optional path operator (?.)". GitHub. Retrieved 2021-01-04.
  2. ^ "Null-conditional Operators (C# and Visual Basic)". Retrieved 2016-01-28.
  3. ^ a b "Optional Chaining". Retrieved 2016-01-28.
  4. ^ a b "Typescript 3.7". Retrieved 2019-11-06.
  5. ^ a b "Ruby 2.3.0 Released". Retrieved 2016-01-28.
  6. ^ a b "Null Safety". Retrieved 2016-01-28.
  7. ^ a b "The question mark operator, ?". Retrieved 2021-10-04.
  8. ^ "Salesforce Winter 21 Release Notes". Salesforce. Retrieved 2020-10-13.{{cite web}}: CS1 maint : url-status (링크)
  9. ^ "Member access operators (C# reference)". Microsoft Docs. Microsoft. Retrieved 29 August 2019.
  10. ^ "Threading Macros Guide". Retrieved 2019-06-07.
  11. ^ "The Existential Operatior". Retrieved 2017-06-15.
  12. ^ "Crystal API: Object#try".
  13. ^ "Other Operators". A tour of the Dart language. Retrieved 2020-01-08.{{cite web}}: CS1 maint : url-status (링크)
  14. ^ "The Gosu Programming Language". Retrieved 2018-12-18.
  15. ^ "8.5. Safe index operator". Retrieved 2020-09-25.
  16. ^ "Optional Chaining".
  17. ^ "PHP: rfc:nullsafe_operator". wiki.php.net. Retrieved 2020-10-01.
  18. ^ "PEP 505 -- None-aware operators". Retrieved 2018-08-27.
  19. ^ "Raku Operators". Retrieved 2016-06-28.
  20. ^ "Trait std::ops::Try". Retrieved 2019-02-26.
  21. ^ A framework to create embedded Domain-Specific Languages in Scala: ThoughtWorksInc/Dsl.scala, ThoughtWorks Inc., 2019-06-03, retrieved 2019-06-03
  22. ^ "NullSafe: Kotlin / Groovy flavored null-safe ? operator now in Scala". Scala Users. 2018-09-12. Retrieved 2019-06-03.
  23. ^ "?. and ?() null-conditional operators (Visual Basic)". Microsoft Docs. Microsoft. Retrieved 29 August 2019.

외부 링크

  • PEP 505, Python의 안전한 항법 운영자 가능성 논의