2011-12-24 3 views
22

나는 D를 배우고과 같은 코드를 많이 보았다 : 느낌표 연산자?

ushort x = to!ushort(args[1]); 

나는이 ushortargs[1] 캐스트 가정하지만, 이것과 cast(ushort)의 차이는 무엇인가?

EDIT : 느낌표 연산자에는 다른 용도가 있습니까? D에서

답변

31

,

to!ushort(args[1]) 

템플릿 인스턴스화

to!(ushort)(args[1]) 

의 약어이며, C++/자바/C#을 같은 언어에서

to<ushort>(args[1]) 

유사하다.

느낌표는 정규 인수가 아니라 템플릿 인수임을 알리는 것입니다. 사람들은 엄청나게 어려운 컴파일러 올바르게 구문 분석 할 수 있기 때문에

표기가 하지 사용 꺾쇠 괄호 않는 것이 훨씬 더 어려운 올바른 컴파일러를 구현할 수 있습니다, (그들은 문법 매우 상황에 맞는합니다). 자세한 내용은 here을 참조하십시오.

내가 아는 유일한 다른 용도는 단 한 번의 'not'조작 (예 : false == !true)입니다 ... 지금은 다른 용도는 생각할 수 없습니다. 주조 대하여


: 값이 범위를 벗어난 경우에 예외를 발생시키지 않도록

cast(ushort)체크 캐스트이다.

to!ushort()은으로 확인 된 값이므로 입니다. 따라서 값이 범위를 벗어나면 예외가 발생합니다.

+0

고맙습니다 =] 대단한 답변입니다! – thwd

+3

그것도 보인다! 예를 들어! string (f)는 부동 소수점 f와 cast (string) f에 유효합니다. –

+5

기술적으로 말하면'to! ushort (val)'은 실제로 캐스트가 아닙니다. 그것은'std.conv.to' 함수를 사용하는 변환입니다. 그것은 검사하지만, 당신이 그것을 캐스트라고 부르기 시작하면, 혼란을 야기 할 위험이 있습니다. 캐스팅은 캐스트 연산자로 수행됩니다. –

3

느낌표는 연산자가 아니며 명시 적 템플릿 인스턴스화 구문의 토큰 부분입니다 (자세한 내용은 here 참조).

std.conv.to (docs)은 임의 유형간에 변환하기위한 함수 템플릿입니다. 이 라이브러리는 전적으로 라이브러리에서 구현되며 언어에 대한 특별한 지원은 없습니다. 캐스트 연산자와 비교하여 더 광범위하고 다른 범위를가집니다.

to 템플릿에는 두 가지 유형 매개 변수가 사용됩니다. "to"유형 및 "from"유형을이 순서대로 사용하십시오. 예제에서 템플릿은 명시 적으로 "to"매개 변수에 대해 단일 형식 인수 ushort을 사용하여 명시 적으로 인스턴스화되고 두 번째 형식 인수 string (main에있는 args이 첫 번째 매개 변수에서 오는 것으로 가정 함)는 자동으로 함수 (args[1])를 "from"매개 변수로 사용하십시오.

결과 함수는 문자열 매개 변수를 사용하여 해당 문자열에서 파싱 된 ushort를 반환하거나 실패 할 경우 예외를 throw합니다. 캐스트 연산자는 이러한 종류의 고급 변환을 시도하지 않습니다.

ushort result; 
result = to!(typeof(result))(args[1]); 
: 거기에 하나 개 이상의 명시 적 템플릿 매개 변수, 또는 그 매개 변수는 하나 이상의 토큰을 ( ushort가 하나의 키워드 토큰)이있는 경우, 괄호에 템플릿 매개 변수 목록을 포장해야

이 예제에서 typeof, (, result)은 4 개의 개별 토큰이므로 괄호가 필요합니다.

이 당신의 마지막 질문에 대답하기 위해, ! 토큰은 템플릿 인스턴스화 관련이없는, 단항 not 연산자에 사용됩니다 :

bool yes = true; 
bool no = !yes; // 'no' is false 
2

당신은 이미 jA_cOp 및 Merhdad에 의해 두 개의 훌륭한 답을 얻었다. 난 그냥 OP 질문에 직접 대답을 원한다 (무엇이 캐스팅 (ushort)의 차이점은 무엇입니까?) - 차이점은 cast(ushort)args[1]은 작동하지 않습니다 (당신은 문자열에서 그와 똑같은 크기로 캐스트 할 수 없음) 반면, to!(type)(param) 템플리트는 문자열로 수행 할 작업과이를 원시 유형으로 변환하는 방법을 알고 있습니다.

+0

고맙습니다. – thwd

관련 문제