29

私はScalaを始めたばかりです。タプル変数をよく使用しています。

たとえば、私が書いたコードは次のとおりです。

/* Count each letter of a string and return in a list sorted by character
 * countLetter("test") = List(('e',1),('s',1),('t',2))
*/
def countLetters(s: String): List[(Char, Int)] = {
  val charsListMap = s.toList.groupBy((c:Char) => c)
  charsListMap.map(x => (x._1, x._2.length)).toList.sortBy(_._1)
}

このタプル構文 (x._1、x._2 など) は Scala 開発者に嫌われていますか?

4

3 に答える 3

29

タプル アクセサーは Scala 開発者に嫌われていますか?

短い答え:いいえ。

少し長い (1 文字分) 答え: はい。

が多すぎる_nとコードのにおいがする可能性があります。私の意見では、あなたの場合、次のほうがはるかに明確です。

def countLetters(s: String): List[(Char, Int)] =
  s.groupBy(identity).mapValues(_.length).toList.sortBy(_._1)

mapValuesノイズの多いタプル アクセサーの必要性を減らすように特別に設計された、このようなメソッドはたくさんあります_1。しかし、時折、それらは何かを書くための最もクリーンな方法です (例えば、_1私の書き直しの最終)。

もう 1 つ注意すべき点は、タプル アクセサーの過度の使用は、タプルをケース クラスに昇格させるためのナッジとして扱う必要があるということです。次の点を考慮してください。

val name = ("Travis", "Brown")

println("Hello, " + name._1)

とは対照的に:

case class Name(first: String, last: String)

val name = Name("Travis", "Brown")

println("Hello, " + name.first)

2 番目のバージョンの追加のケース クラス定義により、1 行のコードで多くの可読性が得られます。

于 2012-12-09T19:30:50.710 に答える
19

より良い解決策がありますx._N。タプルを扱う一般的な方法は、パターン マッチングです。

charsListMap.map{case (a, b) => (a, b.length)}

もご覧ください。タプル用のインストゥルメントscalazがいくつかあります。

import scalaz._
import Scalaz._

scala> (1, "a") bimap (_ + 2, _ + 2)
res0: (Int, java.lang.String) = (3,a2)

scala> ('s, "abc") :-> { _.length }
res1: (Symbol, Int) = ('s,3)
于 2012-12-09T19:33:58.117 に答える