나는 D를 배우고과 같은 코드를 많이 보았다 : 느낌표 연산자?
ushort x = to!ushort(args[1]);
나는이
ushort
에
args[1]
캐스트 가정하지만, 이것과
cast(ushort)
의 차이는 무엇인가?
EDIT : 느낌표 연산자에는 다른 용도가 있습니까? D에서
나는 D를 배우고과 같은 코드를 많이 보았다 : 느낌표 연산자?
ushort x = to!ushort(args[1]);
나는이
ushort
에
args[1]
캐스트 가정하지만, 이것과
cast(ushort)
의 차이는 무엇인가?
EDIT : 느낌표 연산자에는 다른 용도가 있습니까? D에서
,
to!ushort(args[1])
는 템플릿 인스턴스화
to!(ushort)(args[1])
의 약어이며, C++/자바/C#을 같은 언어에서
to<ushort>(args[1])
유사하다.
느낌표는 정규 인수가 아니라 템플릿 인수임을 알리는 것입니다. 사람들은 엄청나게 어려운 컴파일러 올바르게 구문 분석 할 수 있기 때문에
표기가 하지 사용 꺾쇠 괄호 않는 것이 훨씬 더 어려운 올바른 컴파일러를 구현할 수 있습니다, (그들은 문법 매우 상황에 맞는합니다). 자세한 내용은 here을 참조하십시오.
내가 아는 유일한 다른 용도는 단 한 번의 'not'조작 (예 : false == !true
)입니다 ... 지금은 다른 용도는 생각할 수 없습니다. 주조 대하여
: 값이 범위를 벗어난 경우에 예외를 발생시키지 않도록
cast(ushort)
는 체크 캐스트이다.
to!ushort()
은으로 확인 된 값이므로 입니다. 따라서 값이 범위를 벗어나면 예외가 발생합니다.
느낌표는 연산자가 아니며 명시 적 템플릿 인스턴스화 구문의 토큰 부분입니다 (자세한 내용은 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
당신은 이미 jA_cOp 및 Merhdad에 의해 두 개의 훌륭한 답을 얻었다. 난 그냥 OP 질문에 직접 대답을 원한다 (무엇이 캐스팅 (ushort)의 차이점은 무엇입니까?) - 차이점은 cast(ushort)args[1]
은 작동하지 않습니다 (당신은 문자열에서 그와 똑같은 크기로 캐스트 할 수 없음) 반면, to!(type)(param)
템플리트는 문자열로 수행 할 작업과이를 원시 유형으로 변환하는 방법을 알고 있습니다.
고맙습니다. – thwd
고맙습니다 =] 대단한 답변입니다! – thwd
그것도 보인다! 예를 들어! string (f)는 부동 소수점 f와 cast (string) f에 유효합니다. –
기술적으로 말하면'to! ushort (val)'은 실제로 캐스트가 아닙니다. 그것은'std.conv.to' 함수를 사용하는 변환입니다. 그것은 검사하지만, 당신이 그것을 캐스트라고 부르기 시작하면, 혼란을 야기 할 위험이 있습니다. 캐스팅은 캐스트 연산자로 수행됩니다. –