14

「A」、「B」、「C」などの 3 つの文字列があります。それらを連結した結果の文字列を生成する必要があります.2番目の文字列だけが、指定された長さに空白で埋められる必要があります.

これは、直感と一般的な Scala の初心者に導かれた私の最初の試みでした。

val s1 = "A"
val s2 = "B"
val s3 = "C"
val padLength = 20

val s = s1 + s2.padTo(padLength, " ") + s3

padTo が SeqLike を返し、その toString が内部の文字列を返すのではなく、Vector のような表現を返すため、これは間違っています。

Scalaでこれを行うための最良の慣用的な方法は何ですか?

4

7 に答える 7

5

警告を表示する必要があることを誰かが言及する必要があります。

apm@mara:~$ skala -Ywarn-infer-any
Welcome to Scala version 2.11.0-20130524-174214-08a368770c (OpenJDK 64-Bit Server VM, Java 1.7.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> "abc".padTo(10, "*").mkString
<console>:7: warning: a type was inferred to be `Any`; this may indicate a programming error.
       val res0 =
           ^
res0: String = abc*******

この方法で (それ自体) 何も問題がないことに注意してください。

たぶん、次のユースケースがあります:

scala> case class Ikon(c: Char) { override def toString = c.toString }
defined class Ikon

scala> List(Ikon('#'),Ikon('@'),Ikon('!')).padTo(10, "*").mkString
res1: String = #@!*******

またはそれ以上

scala> case class Result(i: Int) { override def toString = f"$i%03d" }
defined class Result

scala> List(Result(23),Result(666)).padTo(10, "---").mkString
res4: String = 023666------------------------

これはあなたのユースケースではないので、冗長で危険に満ちた API を使用したいかどうかを尋ねる必要があるかもしれません。

そのため、ダニエルの答えは正しいものです。彼の例のフォーマット文字列がなぜそれほど恐ろしいように見えるのかはわかりませんが、ほとんどの読み取り可能な文字列では、いくつかの場所で文字をフォーマットするだけでよいため、通常はより無害に見えます。

scala> val a,b,c = "xyz"

scala> f"$a is followed by `$b%10s` and $c%.1s remaining"
res6: String = xyz is followed by `       xyz` and x remaining

偽のフォーマッタを追加する必要がある 1 つのケースは、改行が必要な場合です。

scala> f"$a%s%n$b$c"
res8: String = 
xyz
xyzxyz

インターポレーターは f"$a%n$b" を処理する必要があると思います。待ってください、2.11で修正されました。

scala> f"$a%n$b"  // old
<console>:10: error: illegal conversion character
              f"$a%n$b"

scala> f"$a%n$b"  // new
res9: String = 
xyz
xyz

したがって、補間しない言い訳はありません。

于 2013-06-08T04:04:56.870 に答える
2

これは機能します:

val s = s1 + s2.padTo(padLength, " ").mkString + s3

しかし、どこか不安定な感じ。

于 2013-06-07T14:13:59.633 に答える