Scalaのこのビットで〜は何をしますか?例えばScalaのチルダ演算子
:
scala> val apple = 1
apple: Int = 1
scala> ~apple
res0: Int = -2
そのワームは、私のリンゴに何をしたのですか?
Scalaのこのビットで〜は何をしますか?例えばScalaのチルダ演算子
:
scala> val apple = 1
apple: Int = 1
scala> ~apple
res0: Int = -2
そのワームは、私のリンゴに何をしたのですか?
まず、いくつかのメタアドバイス。コンパイラが構文砂糖をどのように展開するか、型を推定するか、暗黙的な変換を適用するかについては、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演算op eが識別さERSの
+
、-
、!
またはなければならないプレフィックスXオペレータOPから成り~
。 式op e
は、fi後メソッドのアプリケーションe.unary_op
に相当します。プリフィックス演算子は、 の通常の関数アプリケーションと異なり、そのオペランド式がアトミックである必要はありません。例えば、 の入力シーケンス
-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
説明と参考に感謝します。 – Jack
は、整数に適用したときのビット単位の演算子ではありません。それはヘックスで見るのが一番簡単です:
scala> "%x".format(~0x7F)
res0: String = ffffff80
+1を破られます。あなたが答えたときに私はバイナリ文字列を印刷していた。私は1つの答えしか受け入れることができないという謝罪。 – Jack
"最も簡単"は主観的かもしれません... – FracturedRetina
scaleXと、Scalaのためhoogleのような:http://scalex.org/?q=~ –
@GeneTリンクが、それはビット単位ではない作業者の確認のための – sjking