Scala 의 아 이 싱 제거 (13) -- Default Parameter Value
7791 단어 parameter
오랫동안 블 로 그 를 쓰 지 않 았 는데, 지난번 업데이트 가 뜻밖에도 1 월 이 었 다.
일이 바쁘다 는 것 은 모두 핑계 인 데, 어떻게 미국 드라마 를 볼 시간 이 있 겠 는가.
반년 동안 블 로 그 를 등한시 한 것 은 결국 게 으 르 고 관성 적 인 게 으 름 이 었 다.블 로 그 를 쓰 는 일 은 버 리 기만 하면 오랫동안 주 울 수 없다.
여담 은 여기까지 하고 본론 으로 들 어가 자.
Default parameter value, 기본 매개 변수 값.이것 은 쉽게 이해 할 수 있 습 니 다. 매개 변수 에 기본 값 을 주 고 호출 자가 매개 변수 값 을 명시 하지 않 으 면 기본 값 을 사용 합 니 다.명시 적 으로 가리 키 면 명시 적 으로 가리 키 는 값 이다.
예 를 들 어:
1
def hello(name: String = "world") = println("hello " + name)
이 함수, 만약 우리 가 그것 에 게 인 자 를 전달 하지 않 는 다 면, 그것 은 hello World 를 인쇄 할 것 입 니 다.이렇게:
1
hello()
인 자 를 주면:
1
hello("everybody")
hello everybody 를 인쇄 합 니 다.
이 언어 특성 에는 어떤 응용 장면 이 있 습 니까?
그것 은 항상 너무 많은 무 거 운 짐 을 피 하 는 데 쓰 인 다.흔히 볼 수 있 는 전형 적 인 예 는 구조 함수 과부하 이다.
자바 에 서 는 호출 자가 어떤 종류의 인 스 턴 스 를 쉽게 만 들 수 있 도록 몇 개의 매개 변수 목록 이 비교적 짧 은 구조 함 수 를 제공 합 니 다.이러한 구조 함수 가 존재 하 는 유일한 의 미 는 몇 개의 매개 변수 값 을 쓰기 위 한 것 이다.스칼라 에서 이 언어 특성 이 있 으 면 우 리 는 그렇게 번 거 로 울 필요 가 없다.
그렇다면 이 언어 특성 은 어떻게 이 루어 졌 을 까?사실은 간단 하고 엉망 이 야.
이러한 코드:
1
2 3 4 5 6 7
class Greeter { def hello(name: String = "world") = println("hello " + name) } class AnotherClass { new Greeter().hello() }
우리 의 Greeter 류 는 앞에서 언급 한 hello 방법 을 포함 하고 있다.AnotherClass 에서 hello 를 호출 했 고 매개 변수 값 을 명시 하지 않 았 습 니 다.
위의 스칼라 코드 에서 생 성 된 by tecode 는 자바 로 역 컴 파일 되 었 습 니 다.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public class Greeter { public void hello(String name) { Predef..MODULE$.println(new StringBuilder().append("hello ").append(name).toString()); } public String hello$default$1() { return "world"; } } public class AnotherClass { public AnotherClass() { Greeter qual$1 = new Greeter(); String x$1 = qual$1.hello$default$1(); qual$1.hello(x$1); } }
이 를 통 해 알 수 있 듯 이 우리 가 정의 한 hello 방법 은 역 컴 파일 되 어 매우 평범 해 보이 고 하나의 매개 변 수 를 받 아들 이 는 방법 이다.
Greeter 클래스 에서 컴 파일 러 는 다른 방법 인 hello $default $1 을 추 가 했 습 니 다. 이 방법 은 죽은 문자열 을 되 돌려 주 는 것 입 니 다. 그 값 은 World 입 니 다.
AnotherClass 에서 hello 를 호출 할 때 죽은 문자열 을 가 져 와 hello 에 전달 합 니 다.
이렇게 해서 호출 자 는 매개 변수의 기본 값 을 제공 하고 호출 자가 호출 할 때 이 값 을 얻 은 다음 에 전송 하 는 방법 을 제공 합 니 다.
별말
여기 서 나 는 C\# 의 기본 매개 변수 값 의 실현 방식 을 연상 시 켰 다.
C\# 에서 기본 매개 변수의 값 은 호출 자의 상수 로 컴 파일 됩 니 다. Scala 와 같은 호출 자가 제공 하 는 것 이 아 닙 니 다.
이렇게 보면 별 차이 가 없 는 것 같은 데, 죽은 값 을 쓰 고 장 소 를 바 꾸 는 것 이 아닌가?
그렇지 않 습 니 다. 만약 에 호출 자가 A 프로그램 집합 에 있 고 호출 자가 B 프로그램 집합 에 있다 면 A 가 업 데 이 트 될 때 B 는 다시 컴 파일 해 야 최신 기본 값 을 얻 을 수 있 습 니 다.즉, 현재 배치 환경 에 A 와 B 가 동시에 존재 한다 면 우 리 는 새로운 버 전의 A 를 가지 고 오래된 것 을 교체 할 것 이다. 이때 B 는 오래된 기본 매개 변수 값 을 A 에 게 전달 하고 있다.이렇게 하면 매우 기괴 해 보 이 는 행동 의 편 차 를 초래 할 것 이다.
C\# 의 기본 매개 변수 값 실현 에 관심 이 있다 면 제 가 오래 전에 쓴 블 로그. 을 보십시오.
지금 생각해 보면 C\# 라 는 언어 특성의 디자이너 는 왜 그것 을 이렇게 실수 하기 쉬 운 모양 으로 설계 해 야 합 니까?
생각해 도 이해 가 되 지 않 는 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Python]Function Parameters(2)매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어 주기 때문에 여러 개의 입력값을 받을 수 있다. 위와 같이 함수를 호출하면 num1, num2에는 각각 1과 6이 전달되고, *args라는 Para...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.