2017-02-18 11 views
15

だから私はスカラ座を学んだし、私はこの気難しい問題に出くわしを取ることはありません...スカラ文字列オーバーライド: - intはパラメータ

我々はStringを持っており、Intに変換したい場合は、私のすべての例オンラインで見つけたのは「とても簡単です!ただString.toIntを使ってください!オーケー

:十分なシンプル

var x = readLine().toInt 

。私はtoIntStringの関数であると仮定しています。しかし、その場合、私はtoIntにかっこで呼び出すことができるでしょうか? Javaから来て、これは私にとってもっと自然な感じです:

var x = readLine().toInt() 

しかし、 Scalaは次のエラーを表示します:

[error] /home/myhome/code/whatever/hello.scala:13: Int does not take parameters

[error] var x = readLine().toInt()

好奇心。このエラーは何を意味しますか? toIntStringの機能ではありませんか?同様に、なぜ私は両方を行うことができます:

var x = readLine().toLowerCase() 
var y = readLine().toLowerCase 

問題がありますか?

編集:重複した質問ではtoLowerCasetoIntの問題が解決されません。

+0

Scalaのdef foo = {}とdef foo()= {}の違いは何ですか?](http://stackoverflow.com/questions/7409502/what-is-the-difference- def-foo-and-def-foo-in-scalaの間) –

答えて

19

これは良い質問であり、括弧の有無にかかわらず、question about defining zero-arity methodsの複製とはみなされません。

ここで、toInttoLowerCaseの違いは、toIntが標準ライブラリのStringOpsクラスによって提供される構文的豊富さであることです。あなたはREPLでreifyshowCodeを使用してこれを確認することができます。

scala> import scala.reflect.runtime.universe.{ reify, showCode } 
import scala.reflect.runtime.universe.{reify, showCode} 

scala> showCode(reify("1".toInt).tree) 
res0: String = Predef.augmentString("1").toInt 

これは単に濃縮メソッド呼び出しをdesugarsと暗黙的な変換がそれをサポートするために適用されているものを示しています。

toInt method on StringOpsを見ると、かっこなしで定義されていることがわかります。重複している可能性のある質問に対する答えとして、スカラのゼロアリティメソッドが括弧なしで定義されている場合は、括弧で呼び出すことはできません(かっこで定義されていてもどちらでも呼び出せます)。

だから、"1".toInt()は機能しません。 Stringが通常のScala命名規則に従った通常のScalaクラスだった場合、"ABC".toLowerCase()は機能しません。これは、メソッドが副作用ではないのでカッコなしで定義されるためです(これは単なる規約ですが、 Scalaコードで)。

Stringは実際にはスカラ標準ライブラリのクラスではなく、ちょうどjava.lang.Stringです。 JVMレベルでは、カッコで定義されたゼロアリティメソッドとカッコなしで定義されたゼロアリティメソッドの違いはありません。これは純粋にScalaの区別であり、JVMメソッドのシグネチャではエンコードされませんが、クラスファイル。

Scalaの言語設計者は、Scalaで定義されていない(したがって、余分なメタデータを持たない)すべてのゼロアリティメソッドをかっこで定義したものとして扱うことにしました。 StringtoLowerCaseメソッドは、toIntのような構文豊富なメソッドではなく、実際にはjava.lang.Stringクラスのメソッドなので、このカテゴリに属します。つまり、どちらの方法でも呼び出すことができます。

+0

あなたの答えをありがとう。したがって、ゼロアライティメソッドは、括弧なしで定義されたメソッドであり、慣習的なものです(つまり、Javaのように括弧を付けて引数を取らないメソッドを定義できます)。あたかも私がフィールドにアクセスしているかのようにゼロアリティメソッドを呼びますか? Javaクラス/ライブラリを使用する場合、ゼロアリティメソッドなどはありません。また、「副作用」の方法は何ですか? –

+0

@KennethWorden私は引数を取らないメソッドを参照するために "ゼロアリティ"を使用しています。 Javaには引数を取らない(そしてこの意味でゼロアライメントとしてカウントする)メソッドがありますが、それらがかっこで定義されているかどうかを区別しません(Java構文の問題として、 )。 –

+0

ここで「副作用」とは、数学的意味での機能ではないことを意味します。何かを印刷したり、後続の呼び出しで異なる値を返したりします。 –

関連する問題