web-dev-qa-db-ja.com

Scala-中置vsドット表記

どちらか一方のベストプラクティスはありますか?私は読んでいますthe Scala Odersky、et al。による本で、多くのCollections API関数に中置辞が使用されているようですが、ドットは予約されていますプログラマー定義関数用。

39
Kevin Li

私は個人的にこれに関する厳格な規則はありませんが、シンボリックメソッド名でのみ中置記法を使用し、英数字のものではドット表記を使用する傾向があります。

中置記法は、後でコードを変更するのを面倒にします。下記は用例です。

次のコード行があると想像してください。

_xs filter { f } map { g }
_

後のある時点で、最後にtoListを追加する必要があるとします。あなたはそれをそう言います:

_xs filter { f } map { g } toList
_

これにより、セミコロンの推論の問題が発生する可能性があります。これらの問題を回避するには、末尾にセミコロンを付けるか、改行を入れます。私の意見では、どちらのオプションも醜いです。このナンセンスをすべて避けるために、私はxs.filter(f).map(g)を使用することを好みます。この構文を使用すると、リファクタリングが常に簡単になります。

別の例:コードに次のものがあるとします。

_if(foo contains bar) { ..
_

言う、私は条件を否定する必要があります。次のように変更すると:

_if(!foo contains bar) { ..
_

バマー。これは_(!foo).contains(bar)_として解析されます。私たちが望んでいたものではありません。

または、新しい条件を追加する必要があり、次のように変更するとします。

_if(foo contains bar && cond) { ..
_

もう一つの残念。これはfoo.contains(bar.&&(cond))として解析されます。繰り返しますが、私たちが望んでいたものではありません。

もちろん、かっこをたくさん追加することもできますが、ドット表記に比べると見苦しく、読みにくく、編集しにくいでしょう。

さて、私が上で言ったことはすべて、シンボリックメソッド名にも当てはまります。ただし、シンボリックメソッドをドット構文で使用すると不自然に見えるため、中置構文を使用することをお勧めします。


上記のガイドラインの1つの例外:内部DSL。それらは通常、ドキュメント/例(通常は中置記法を使用)に規定されている方法で記述されたときに解析の問題を引き起こさないように注意して作成されています。

50
missingfaktor

それは個人的な好みの問題です。どちらかのスタイルを使用するかどうかの決定は、コードを最も読みやすくするものに基づいて行う必要があります。

ただし、ドットと括弧を省略する機能は、特定の構文構造にのみ制限されているため、場合によっては、それらの使用にフォールバックする必要があることに注意してください。

12
dhg

良い スタイルガイド 公式Scalaサイトのドキュメントには、ドット表記よりも適切な使用法の中置記法が記載されています。

接尾辞表記:

names.toList
// is the same as
names toList // Unsafe, don't use!

アリティ-1:

// right!
names foreach (n => println(n))
names mkString ","
optStr getOrElse "<empty>"
// wrong!
javaList add item

高階関数:

// wrong!
names.map (_.toUpperCase).filter (_.length > 5)
// right!
names map (_.toUpperCase) filter (_.length > 5)

シンボリックメソッド/オペレーター:

// right!
"daniel" + " " + "Spiewak"
// wrong!
"daniel"+" "+"spiewak"
3
Saeed Zarinfam

catsライブラリを使用してデカルト主義者を作成している場合、mapに中置記法を使用するとうまく機能することがわかりました。例えば。:

(fetchIt(1) |@| fetchIt(2) |@| fetchIt(3)).map(MyCaseClass)

次のように、周囲の括弧を取り除くことができます。

fetchIt(1) |@| fetchIt(2) |@| fetchIf(3) map MyCaseClass

私の見解では、2番目のバリアントの方が読みやすくなっています。好みの問題だと思います。私の2セントの価値を追加したかっただけです。

上記は| in "| @ |" 「マップ」のmよりも優先順位が高くなります。詳細については、Scala lang仕様のこの部分をお読みください。

式に複数の中置演算がある場合、優先順位の高い演算子は、優先順位の低い演算子よりも緊密にバインドされます。

http://scala-lang.org/files/archive/spec/2.12/06-expressions.html#infix-operations

0
Peter Perháč