1. ホーム
  2. scala

[解決済み] に似た三項演算子。

2023-02-21 02:46:58

質問

このような構文を避けたいのですが。

val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result

さて、この例では thenelse の分岐は単純ですが、複雑なものをイメージすることができます。 私は以下のように構築しました。

object TernaryOp {
  class Ternary[T](t: T) {
    def is[R](bte: BranchThenElse[T,R]) = if (bte.branch(t)) bte.then(t) else bte.elze(t)
  }
  class Branch[T](branch: T => Boolean) {
    def ?[R] (then: T => R) = new BranchThen(branch,then)
  }
  class BranchThen[T,R](val branch: T => Boolean, val then: T => R)
  class Elze[T,R](elze: T => R) {
    def :: (bt: BranchThen[T,R]) = new BranchThenElse(bt.branch,bt.then,elze)
  }
  class BranchThenElse[T,R](val branch: T => Boolean, val then: T => R, val elze: T => R)
  implicit def any2Ternary[T](t: T) = new Ternary(t)
  implicit def fct2Branch[T](branch: T => Boolean) = new Branch(branch)
  implicit def fct2Elze[T,R](elze: T => R) = new Elze(elze)
}

と定義すると、上記の単純な例を置き換えることができる。

this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}

しかし、どうすれば s: String => ? みたいなのが欲しいです。

this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}

コンパイラが型を推論するために余分なものが必要なのでしょう。

どのように解決するのですか?

以下のように Scalaで三項演算子を定義して、先頭のトークンを保存するには? に対する答えと Optionで値をラップするのは良いパターンですか? を取得するために

scala>   "Hi".getClass.getSimpleName |> {x => x.endsWith("$") ? x.init | x}
res0: String = String

scala> List.getClass.getSimpleName |> {x => x.endsWith("$") ? x.init | x}
res1: String = List

これはあなたのニーズにとって適切ですか?