2012-03-19 2 views
4

可能性の重複:
What is the rule for parenthesis in Scala method invocation?メソッドに括弧が必要(または禁止)されるのはいつですか?

私はスカラ座に新たなんだ、と私はいくつかの混乱を持って後置演算子の()

私はtoLongとのtoStringと言われた

任意の整数のための後置演算子であるので、私は、次の操作を試みた:

scala> 7 toString 
res18: java.lang.String = 7 

scala> 7.toString() 
res19: java.lang.String = 7 

scala> 7.toString 
res20: java.lang.String = 7 

scala> 7.toLong 
res21: Long = 7 

scala> 7.toLong() 
<console>:8: error: Long does not take parameters 
       7.toLong() 
        ^
を0

演算子の後に "()"を使用するのはいつですか?そこにはどんなパターンがありますか?

Big Thanks!

答えて

12

まず、それが後置演算子よりIntクラスのメソッドとしてtoLongtoStringについて考えることはおそらく良いでしょう。整数リテラルはScalaのオブジェクトであるため、メソッドのうち2つはtoLongtoStringです。 (間違いなく、暗黙的な変換などのために、状況はIntと若干複雑ですが、これは初心者として考えるのに良い方法です)

かっこを削除するルールは何ですか?メソッドが引数を取らない場合は、Scala構文を使用して()を削除することができます。この方法は、括弧なしで定義されている場合は、それらはすべてで許可されていません。

最後に
class A() { 
    def stuff() = "stuff" 
    def things = "things" 
} 

val a = new A() 

a.stuff  // fine 
a.stuff() // fine 
a.things // fine 
a.things() // error! 

、あなたは括弧をドロップしますとするとき、あなたがそれらを保つないとき?規約上、Scalaでは副作用のないメソッドの括弧を削除し、副作用がある場合はそれらを保持します。明らかにこれは単なるスタイルですが、コードがどのように動作するかについて読者にさらなる手がかりを与えます。

+0

ので、私はエラーを得ましたか。 –

+0

私はそれを得た!ありがとうdhg! –

+0

@dhg:そのような副作用の例を教えていただけますか?私はすべてのミューテータメソッドには副作用があり、アクセサには副作用がないと思います。私は理解して正しいですか? – SlowAndSteady

5

は、詳細な情報については、What is the rule for parenthesis in Scala method invocation?を参照してください。さらにInt.toLong

は括弧なしで定義されているため、括弧で起動することができません。それは副作用を持たないので、かっこなしで定義される可能性が高い(これは規約です)。 toString()以来

は、相互運用性のために、それは括弧で定義されたため、または括弧なしで起動することができ、ジャワから来ています。 Intクラスは括弧なしの方法toLongを定義するため

+0

それがありました!ありがとうございました! –

+2

私はちょうどそれが引数として '1'を渡ししようとするため、(1) '、誤りである '(1)' 'で'(123.toString())ことを発見し2''が、 '(123.toString) 'toString()'メソッドに渡します。予想外のこと。 –

+0

@Luigiは私にはバグのようですが、パーサーが '123'の 'toString'を呼び出す前に' toString'に '(1)'を付けなければならないというシナリオは想像できません。 – dhg

関連する問題