2011-11-08 3 views
17

Scalaの長い関数シグネチャはどこで分割されますか?

def foo(x: Int) = x + 1 

のような定義がいいと短く、きれいに見えますが、署名自体は、

def foo[T <: Token[T]](x: ArrayBuffer[T], y: T => ArrayBuffer[() => T]): (T, T, BigDecimal) = { 
    // ... 
} 

を不快に長くなったとき、私はそれをどこに分割するか分かりません。

def foo(
    x: Int, 
    y: Int 
): Int = { 
    // ... 
} 

def foo(
     x: Int, 
     y: Int 
    ): Int = 
{ 
    // ... 
} 

def foo(
     x: Int, 
     y: Int 
    ): Int 
= { 
    // ... 
} 

def foo(
     x: Int, 
     y: Int 
    ): 
Int = { 
    // ... 
} 

しかし、私は私のチームメイトに少なくとも迷惑を引き起こすであろう、これらのいずれかに慣れるする必要がありますするつもりだことを考える:私はぎこちない見て、次のすべてを見つけますか?

+1

他のすべてのインデントと一貫しているので、私は個人的にトップ1を使用します。しかし、私はこれがSOの質問よりもProgrammers.SEの質問の方が多いと思っています。 –

答えて

17

Scala style guideはこれについては何も言及していません。実際、より少ないパラメータでメソッドを使用することをお勧めします:-)。

それは後続の各ラインは、最初のかっこと揃うように分割をお勧めしない関数呼び出しのために

:私は「一緒に、物事のような状態維持」のルールに従って分割でしょう、あなたの場合は個人的に

foo(someVeryLongFieldName, 
    andAnotherVeryLongFieldName, 
    "this is a string", 
    3.1415) 

def foo[T <: Token[T]] 
     (x: ArrayBuffer[T], y: T => ArrayBuffer[() => T]) 
     : (T, T, BigDecimal) = { 
    // ... 
} 

パラメータが1行にあるので、戻り値の型は1行にあり、型制限は1行にあります。 、ロングタイプの署名は、多くの場合、このように書かれているHaskellで

4

someFunc :: (Some Constraints Go Here) 
     => Really Long Arg1 Type 
     -> Really Long Arg2 Type 
     -> Really Long Result Type 
somefunc x y = ... 

スカラ座にこのHaskellismを翻訳するには、

def foo [ T <: Token[T] ] 
     (x : ArrayBuffer[T] 
     , y : T => ArrayBuffer[() => T] 
     ) : (T, T, BigDecimal) = { 
    // ... 
} 

私はそれを行うだろう方法です。 Scalaコミュニティーにどのようにそれが正当化されているか分かりません。

+1

上記のHaskellとScalaの構文を比較することで、コンマ、カッコ、セミコロンのどれくらいのノイズが発生するかを知ることができました。 –

関連する問題