2012-02-25 2 views
26

Scala의이 비트에서 ~ 할 일은 무엇입니까? 예를 들어Scala의 물결표 연산자

:

scala> val apple = 1 
apple: Int = 1 

scala> ~apple 
res0: Int = -2 

이 웜은 내 사과에 무슨 짓을 한거야?

+2

scaleX가 스칼라에 대한 hoogle 같은 : http://scalex.org/?q=~ –

+0

@GeneT 링크는 비트 NOT 운영자의 확인을 위해 – sjking

답변

46

, 일부 메타 조언. 컴파일러가 구문 설탕을 확장하거나, 유형을 유추하거나 암시 적 변환을 적용하는 방법을 궁금해 할 때는 언제든지 scala -Xprint:typer -e <expr>을 사용하여 어떤 일이 일어 났는지 보여줍니다.

scala -Xprint:typer -e "val a = 2; ~a" 

... 
private[this] val a: Int = 2; 
private <stable> <accessor> def a: Int = $anon.this.a; 
$anon.this.a.unary_~ 

좋아는 접두사 ~unary_~의 일반적인 메소드 호출로 확장된다. language specification 가입일

:

6.12.1 사전 인터넷 X 조작

사전 인터넷 X 조작 연산 E는 확인 시험 인터넷 ERS의 일 +, -, ! 이상이어야 미리 인터넷 X 오퍼레이터 OP ​​이루어져 ~. 표현식 op e은 게시 이후 방법 응용 프로그램 e.unary_op과 동일합니다.

Prefx 연산자는 의 일반 함수 응용 프로그램과 달리 피연산자 표현식이 원자적일 필요는 없습니다. 예를 들어, 입력 시퀀스 -sin(x)-(sin(x))으로 읽히지 만 함수 응용 프로그램 부정합 인 sin(x)은 피연산자 negate 및 (x)에 fi 연산자 sin에서 의 응용 프로그램으로 구문 분석됩니다.

(이것은이 힘을 미쳐 좋은 생각이 아니다 있지만!) 접두사 연산자 종류의 내장에 제한되지 않음을 의미

, 그들은 자신의 유형에 사용할 수 있습니다

scala> object foo { def unary_~ = "!!!" } 
defined module foo 

scala> ~foo 
res0: java.lang.String = !!! 

그럼 궁금한 점이 있습니까? methods starting with u에 대한 표준 라이브러리의 ScalaDoc 인덱스를 체크 아웃 할 수 있습니다. nightly ScalaDoc에는이 방법에 대해 최근에 추가 된 문서가 있습니다.

the bitwise negation of this value 
Example: 
~5 == -6 
// in binary: ~00000101 == 
//    11111010 
+0

설명 및 참조 주셔서 감사합니다. – Jack

16

은 정수에 적용 할 때 비트 연산자가 아닙니다. 그것은 진수에 표시하는 것이 가장 쉬운 방법이다 : 첫째

scala> "%x".format(~0x7F) 
res0: String = ffffff80 
+2

하나를 나뉩니다. 당신이 대답 할 때 바이너리 문자열을 인쇄하는 것으로 주변을 둘러 보았습니다. 내가 한 가지 대답만을 받아 들일 수 있다는 사과. – Jack

+2

"가장 쉬운"주관적 일 수 있습니다 ... – FracturedRetina