2017-06-20 4 views
1

一般にを使用しています。オブジェクトの場合はです。このタイプの記法は何ですか? これから正しい結果を得るにはどうすればよいですか?1 +(2)スカラーで正しい答えが得られます。

+0

Scalaでは、 '+'はメソッド名であり、演算子ではありません。 – Shankar

+0

あなたの質問を理解できません.... 1ここでは整数、オブジェクト、 '+'整数のメソッド、そして何ですか? –

+0

@JohnZeng私は、Scalaにはすべてのオブジェクトのための豊富なラッパーライブラリがあると読んでいます。Int、Rich float for floatなど。だからこそ、正確に何が起きているのでしょうか? – NeoWelkin

答えて

2
Scalaで

、例えば1の目的は、伝統的なメソッド呼び出し構文を使用して、1 + 2を書かれている可能性がIntを入力します。このオブジェクトには、別のIntをパラメータとして受け入れるメソッド+があります。 さらに、Scalaには、をと書くのと同じように、1.+(2)1 + 2と書くことを可能にする文法的な糖があります。

+0

私の質問のあなたの説明を得た。あなたはfoo example.iをJavaのバックグラウンドから説明できますか? – NeoWelkin

+0

'foo.map(bar)'は、この構文的な砂糖の一般的な例または一般化を意味します。パラメータ '' map'を持つオブジェクト 'Foo'を持っていれば、それはパラメータをとります。 'bar'を実行すると、' foo.map(bar) 'または' foo map bar'と書くことができます。ちょうど '+'のように: '1 + 2'はスカラーコンパイラによって内部的に' 1。+(2) 'に変換されます。 – EmilioMg

10

私が言う「Scalaではプログラミング、」からテキストのコピー&ペーストしています:

を実際に伝統的な意味での演算子を持っていないため、Scalaは技術的には、演算子のオーバーロードを持っていません。その代わりに、+、 - 、*、および/などの文字をメソッド名に使用できます。したがって、ステップ1でScalaインタプリタに1 + 2をタイプすると、実際にはIntオブジェクト1の+という名前のメソッドが呼び出され、2としてパラメータとして渡されました。図3.1に示すように、あなたは、代替的に(1)+(2)

enter image description here

+3

これはメソッドであり、関数ではありません。違いがあります。ここをクリックしてください:https://stackoverflow.com/questions/155609/difference-between-a-method-and-a-function – EmilioMg

+0

@Ramesh Maharjanはその関数を呼び出すドット演算子ですか? – NeoWelkin

+1

@NeoWelkin私は自分の答えを更新しました。 EmillMgに感謝します。 :) –

2

Scalaでは、Javaの「プリミティブ型」として知られているものもオブジェクトであり、AnyValを拡張しています。 Scalaでは、すべての値はクラスに応じていくつかのメソッドをサポートするオブジェクトです。 Int,Doubleなどの数値タイプは、合計のメソッド+です(メソッド名は英数字に限定されません)。さて、ポイントは、Scalaは、これらの方法は、したがって1+2 == 1.+(2)

0

DocumentationIntクラスのSource Fileから、operationsoperator syntax)として表示されるように呼び出して、あなたが+方法の説明を取得することができますし、それはバージョンをオーバーロードしています許可syntactic sugarを提供することである。

/** Returns the sum of this value and `x`. */ 
def +(x: Byte): Int 
/** Returns the sum of this value and `x`. */ 
def +(x: Short): Int 
/** Returns the sum of this value and `x`. */ 
def +(x: Char): Int 
/** Returns the sum of this value and `x`. */ 
def +(x: Int): Int 
/** Returns the sum of this value and `x`. */ 
def +(x: Long): Long 
/** Returns the sum of this value and `x`. */ 
def +(x: Float): Float 
/** Returns the sum of this value and `x`. */ 
def +(x: Double): Double 

ご覧のとおり、+は方法のようです。表記1.+(2)を理解すれば十分です。

ただし、これは画像全体ではありません。詳細については、hereを参照してください。

1

1 + 2は、1.+(2)の省略形です。ここでは、+がこのメソッドの名前です。 Scalaはメソッド名の英数字以外の文字に対して愚かな偏見を持っていません。名前のシンボルは、まさにほぼどんなシンボルでも定義できます。一般的に

、あなたはmethod 2つのパラメータ(暗黙の1、明示的な1)を持つ方法であるa.method(b)の省略形としてa method bを書くことができます。たとえば、1.to(10)の代わりに1 to 10

あなたは読みやすいと思うものを使用してください。 Scalaプログラマーの初めは、Java構文に固執しがちですが、それは問題ありません。もちろん、最も強硬なJavaプログラマでさえもa + bよりもa.+(b)を好むようです。

0

以下のコードは、オブジェクトintに、私はメソッドを適用したいです。だから私は押された。私に+がそれらの一部であるメソッドのセットを与えました。引数としてintをとり、Intを返します。それで、すべてを説明します。

主な理由は、Scalaは実際に伝統的な意味での演算子を持っていないが、それはメソッドを持って

です。

scala> val x=2; 
x: Int = 2 

scala> x. 
!= - == ^   compareTo  intValue  isPosInfinity isValidShort round  toBinaryString toFloat   toRadians underlying 
% / >  abs   doubleValue isInfinite  isValidByte  isWhole  self   toByte   toHexString  toShort  until 
& < >= byteValue floatValue isInfinity  isValidChar  longValue  shortValue toChar   toInt   unary_+  | 
* << >> ceil  floor   isNaN   isValidInt  max   signum  toDegrees  toLong   unary_- 
+ <= >>> compare  getClass  isNegInfinity isValidLong  min   to   toDouble   toOctalString unary_~ 

scala> x.+ 
         def +(x: Long): Long def +(x: Float): Float  def +(x: Int): Int def +(x: Double): Double 
def +(x: Short): Int def +(x: Char): Int def +(x: String): String def +(x: Byte): Int 

scala> x.+ 
         def +(x: Double): Double def +(x: Char): Int def +(x: Short): Int def +(x: String): String 
def +(x: Long): Long def +(x: Float): Float  def +(x: Int): Int def +(x: Byte): Int 

scala> x.+(3) 
res1: Int = 5 
関連する問題