가변 섀도잉

Variable shadowing

컴퓨터 프로그래밍에서 가변 섀도우링특정 범위(결정 블록, 방법 또는 내부 클래스) 내에서 선언된 변수가 외부 범위에서 선언된 변수와 이름이 같을 때 발생한다. 식별자(변수보다는 이름) 수준에서 이를 이름 마스킹이라고 한다. 이 외측 변수는 내측 변수에 의해 음영 처리된다고 하며, 내측 식별자는 외측 식별자를 가린다고 한다. 이는 언어의 이름 결정 규칙에 따라 달라지는 그림자 변수 이름의 후속 용도가 어떤 변수를 가리키는 것인지가 분명하지 않을 수 있기 때문에 혼란을 초래할 수 있다.

가변 섀도잉을 가장 먼저 도입한 언어 중 하나가 ALGOL이었는데, 이 언어에서 블록을 처음 도입해 스코프를 설정했다. 그것은 또한 C, C++, 자바를 포함한 많은 파생 프로그래밍 언어들에 의해 허용되었다.

C# 언어는 이 전통을 깨고, 내측과 외측 클래스, 그리고 방법과 포함 클래스 사이에 가변 섀도우잉을 허용하지만, if-block과 그 포함 방법 사이 또는 스위치 블록의 사례문 사이는 허용하지 않는다.

어떤 언어들은 다른 언어들보다 더 많은 경우에 가변적인 그림자를 허용한다. 예를 들어 Kotlin은 함수의 내부 변수를 허용하여 전달된 인수를 섀도우하고 내부 블록의 변수를 허용하여 외부 블록의 다른 변수를 섀도우할 수 있는 반면 Java는 이러한 변수를 허용하지 않는다. 두 언어 모두 함수에 전달된 인수를 허용하고/클래스 필드를 음영으로 표시할 수 있다.[1]

일부 언어에서는 CoffeeScript와 같이 가변 섀도우를 완전히 허용하지 않는다.[2]

루아

다음 루아 코드는 가변 섀도우링의 예를 다중 블록으로 제공한다.

v = 1 -- 글로벌 변수  하다   국부적 v = v + 1 - 글로벌 v를 그림자처럼 보여주는 새로운 지역   인쇄하다(v) - 인쇄물 2    하다     국부적 v = v * 2 -외부 로컬 v를 음영으로 표시하는 또 다른 로컬 v     인쇄하다(v) - 인쇄물 4   종지부를 찍다    인쇄하다(v) - 인쇄물 2 종지부를 찍다  인쇄하다(v) - 인쇄 1 

파이톤

다음 Python 코드는 가변 섀도잉의 다른 예를 제공한다.

x = 0  반항하다 바깥의():     x = 1      반항하다 내면의():         x = 2         인쇄하다("inner:", x)      내면의()     인쇄하다("outer:", x)  바깥의() 인쇄하다("글로벌:", x)  # 프린트 #내부: 2 # 바깥쪽: 1 # 글로벌: 0 

Python에는 변수 선언이 없고 변수 할당만 있으므로 키워드 nonlocal Python 3에서 소개된 기능은 가변 섀도우를 방지하고 비 로컬 변수에 할당하는 데 사용된다.

x = 0  반항하다 바깥의():     x = 1      반항하다 내면의():         국외의 x         x = 2         인쇄하다("inner:", x)      내면의()     인쇄하다("outer:", x)  바깥의() 인쇄하다("글로벌:", x)  # 프린트 #내부: 2 # 바깥쪽: 2 # 글로벌: 0 

키워드 global 가변 섀도우를 방지하고 전역 변수에 할당하는 데 사용:

x = 0  반항하다 바깥의():     x = 1      반항하다 내면의():         전지구적 x         x = 2         인쇄하다("inner:", x)      내면의()     인쇄하다("outer:", x)  바깥의() 인쇄하다("글로벌:", x)  # 프린트 #내부: 2 # 바깥쪽: 1 # 글로벌: 2 

fn 본래의() {     하게 하다 x = 0;          {         하게 하다 x = 1;         인쇄하다!("내부 x: {}", x); // 인쇄 1     }          인쇄하다!("외부 x: {}", x); // 0인쇄          // 그림자     하게 하다 x = "러스트";     인쇄하다!("외부 x: {}", x);  // '러스트' 인쇄 }  //# 내부 x: 1 //# 외부 x: 0 //# 아우터 x: 러스트 

C++

#include <아이오스트림>  인트로 본래의() {   인트로 x = 42;   인트로 합계를 내다 = 0;    을 위해 (인트로 i = 0; i < 10; i++) {     인트로 x = i;     찌꺼기::뻐드렁니가 나다 << "x: " << x << '\n'; // 0 ~ 9의 i 값 인쇄     합계를 내다 += x;   }    찌꺼기::뻐드렁니가 나다 << "sum: " << 합계를 내다 << '\n';   찌꺼기::뻐드렁니가 나다 << "x: " << x   << '\n'; // 42개 출력    돌아오다 0; } 

자바

공중의 계급 그림자 {     사유의 인트로 마인트바 = 0;      공중의 공허하게 하다 섀도우더바() {         // 위의 개체 인스턴스(instance) 필드와 이름이 같으므로 위에 그림자를 드리운다.          // 이 방법 안에 입력한다.         인트로 마인트바 = 5;          // 단순히 'myIntVar'를 참조하면 이 방법 중 하나가          // (같은 이름의 두 번째 그림자를 표시)         시스템.밖으로.인쇄하다(마인트바); // 인쇄 5          // 이 클래스의 섀도우형 myIntVar를 참조하려면          // 다음과 같이 언급한다.         시스템.밖으로.인쇄하다(.마인트바); // 0인쇄     }      공중의 정태의 공허하게 하다 본래의([] 아그){         새로운 그림자().섀도우더바();     } } 

자바스크립트

ECMAScript 6 소개 let 그리고 const 블록 범위 지정으로 가변 섀도잉 허용

기능을 하다 마이펑크() {     하게 하다 my_var = '시험';     만일 (진실의) {         하게 하다 my_var = '새로운 시험';         위로하다.통나무를 하다(my_var); // 새 테스트     }     위로하다.통나무를 하다(my_var); // 테스트 } 마이펑크(); 

참고 항목

참조

  1. ^ "Archived copy". Archived from the original on 2020-11-28. Retrieved 2021-10-04.{{cite web}}: CS1 maint: 타이틀로 보관된 사본(링크)
  2. ^ "Archived copy". Archived from the original on 2021-10-04. Retrieved 2021-10-04.{{cite web}}: CS1 maint: 타이틀로 보관된 사본(링크)