Scala 의 아 이 싱 제거 (13) -- Default Parameter Value

7791 단어 parameter
나의 새 블 로그 주소 에 관심 을 가 져 주 십시오: http://cuipengfei.me/
 
오랫동안 블 로 그 를 쓰 지 않 았 는데, 지난번 업데이트 가 뜻밖에도 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\# 라 는 언어 특성의 디자이너 는 왜 그것 을 이렇게 실수 하기 쉬 운 모양 으로 설계 해 야 합 니까?
생각해 도 이해 가 되 지 않 는 다.

좋은 웹페이지 즐겨찾기