5

オブジェクトを返す式があり、特定のブール条件が true の場合にのみ、結果のオブジェクトでメソッドを呼び出したいと考えています。結果 (オブジェクト、またはオブジェクトでメソッドを呼び出した結果) を val で取得したいと考えています。

1 つの方法は、次の例のように一時変数を使用することです。この例でList(3, 1, 2)は、オブジェクトを返す (潜在的に複雑な) 式listが一時変数であり、.sorted条件付きで呼び出したいメソッドです。

import scala.util.Random

val condition = Random.nextBoolean
val result = {      
  var list = List(3, 1, 2);
  if (condition) list = list.sorted
  list
}

おそらく一時変数を使用せずに、これを行う標準的な方法は何でしょうか?

ご了承ください

if (condition) List(3, 1, 2).sorted else List(3, 1, 2)

List(3, 1, 2)一般に、繰り返したくない複雑な表現になる可能性があるため、満足のいくものではありません。

残念ながら、明示的な型を指定する必要があることがわかった方法を次に示します (上記のように一時的な var を導入するよりも長く複雑です)。

val condition = Random.nextBoolean
val result =
  (
    if (condition)
      {l: List[Int] => l.sorted}
    else
      identity(_: List[Int])
  ).apply(List(3, 1, 2))

私が認識できなかったもっときちんとした方法があるに違いないと思います。

更新:残念ながらまだ明示的な型情報が必要な、やや醜い方法:

val condition = Random.nextBoolean    
val result = {
    l: List[Int] => if (condition) l.sorted else l
  }.apply(List(3, 1, 2))
4

2 に答える 2

10

次の前方パイプ演算子を使用できます。

implicit class PipedObject[A](value: A) {
  def |>[B](f: A => B): B = f(value)
}

scala> List(3, 1, 2) |> (xs => if (true) xs.sorted else xs)
res1: List[Int] = List(1, 2, 3)
于 2013-04-04T22:32:05.507 に答える