세이프 내비게이션 조작자
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] 등의 언어로 지원되고 있다.현재 이 운영자에 대한 일반적인 명명 규칙은 없지만 안전 항법 운영자가 가장 널리 사용되는 용어다.
이 연산자를 사용하는 주된 장점은 파멸의 피라미드를 피한다는 것이다.여러 개의 중첩을 쓰는 대신if
s, 프로그래머는 일반적인 체인을 사용할 수 있지만, 점(또는 체인에 사용되는 다른 문자) 앞에 물음표 기호를 추가할 수 있다.
안전항법 운영자와 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.바
그루비
반항하다 이름을 붙이다 = 기사?.작가들?[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)?.작가?.이름
참고 항목
참조
- ^ "Null-conditional Operators (C# and Visual Basic)". Retrieved 2016-01-28.
- ^ a b "Optional Chaining". Retrieved 2016-01-28.
- ^ a b "Typescript 3.7". Retrieved 2019-11-06.
- ^ a b "Ruby 2.3.0 Released". Retrieved 2016-01-28.
- ^ a b "Null Safety". Retrieved 2016-01-28.
- ^ a b "The question mark operator, ?". Retrieved 2021-10-04.
- ^ "Salesforce Winter 21 Release Notes". Salesforce. Retrieved 2020-10-13.
{{cite web}}
: CS1 maint : url-status (링크) - ^ "Member access operators (C# reference)". Microsoft Docs. Microsoft. Retrieved 29 August 2019.
- ^ "Threading Macros Guide". Retrieved 2019-06-07.
- ^ "The Existential Operatior". Retrieved 2017-06-15.
- ^ "Crystal API: Object#try".
- ^ "Other Operators". A tour of the Dart language. Retrieved 2020-01-08.
{{cite web}}
: CS1 maint : url-status (링크) - ^ "The Gosu Programming Language". Retrieved 2018-12-18.
- ^ "8.5. Safe index operator". Retrieved 2020-09-25.
- ^ "Optional Chaining".
- ^ "PHP: rfc:nullsafe_operator". wiki.php.net. Retrieved 2020-10-01.
- ^ "PEP 505 -- None-aware operators". Retrieved 2018-08-27.
- ^ "Raku Operators". Retrieved 2016-06-28.
- ^ "Trait std::ops::Try". Retrieved 2019-02-26.
- ^ A framework to create embedded Domain-Specific Languages in Scala: ThoughtWorksInc/Dsl.scala, ThoughtWorks Inc., 2019-06-03, retrieved 2019-06-03
- ^ "NullSafe: Kotlin / Groovy flavored null-safe ? operator now in Scala". Scala Users. 2018-09-12. Retrieved 2019-06-03.
- ^ "?. and ?() null-conditional operators (Visual Basic)". Microsoft Docs. Microsoft. Retrieved 29 August 2019.
외부 링크
- PEP 505, Python의 안전한 항법 운영자 가능성 논의