2016-08-03 19 views
2

を再定義せずにデフォルトを使用します。私はparがそれ自身のデフォルトを使用することを許可したいが、Scala(醜いロジックなし)でそれを行う方法を見ないので、実際にはこのようなデフォルトを再定義しなければならない。Scalaはどのように私のように定義された機能を持っている彼らに

drmARaw.par(
    min = minPar.getOrElse(-1),// if par changes this may the be wrong default 
    exact = exactPar.getOrElse(-1),// if par changes this may the be wrong default 
    auto = autoPar.getOrElse(true)) 

デフォルトは今までにこれを変更した場合はminexactに間違ったデフォルト値を渡します。複雑なロジックを使用して、parのバージョンをOptionのパラメータがnonEmptyminParexactParのどちらに基づいて呼び出すかを決めることができますが、これはかなり醜いですし、デフォルトのパラメータを持つ関数ごとに異なる方法で記述する必要があります。この状況は、ほぼすべてのScalaライブラリで発生します。彼らがデフォルトを変更して気付かない場合、私のコードは壊れてしまいます。

上記の例では問題が説明されていますが、のすべてのケースを対象とするScalaイディオムを探しています。関数のデフォルトが変更される可能性があります。私は、lib関数のデフォルトのparamの変更とは無関係なコードを書いています。

+0

それぞれのデフォルト値、つまり 'val MinParDefault = -1'に定数を使うことができます。そして、あなたは 'minPar.getOrElse(MinParDefault)'でそれを使うことができます。 –

+0

私は 'par'関数を変更できません。libにあります。 – pferrel

+0

私の間違い - 私は 'minPar'などを意味しました。 –

答えて

0

したがって、渡されたパラメータとして解凍して送信する必要がある3つのOptionがあります。オプションがNoneの場合を除いて、呼び出されたメソッドは欠落しているパラメータに独自のデフォルト値を使用する必要があります。

あなたの唯一の選択はブルートフォースです。

(minPar, exactPar, autoPar) match { 
    case (Some(m),Some(e),Some(a)) => par(min=m, exact=e, auto=a) 
    case (Some(m),Some(e),None) => par(min=m, exact=e  ) 
    case (Some(m),None, Some(a)) => par(min=m,   auto=a) 
    case (Some(m),None, None) => par(min=m    ) 
    case (None, Some(e),Some(a)) => par(  exact=e, auto=a) 
    case (None, Some(e),None) => par(  exact=e  ) 
    case (None, None, Some(a)) => par(    auto=a) 
    case (None, None, None) => par() 
} 

2つのパラメータを使用すると簡単です。 3でそれは管理可能です。その後、痛い。

+1

真理値表 - 少なくとも彼らはあなたにうそをつかない。 – bash0r

+0

はい、これは私が醜い論理を意味していたものですが、あなたはそれが可能な限りきれいにしていますので、これを行う最良の方法だと私は受け入れます。 Scalaの神々が聞いてくれることを祈っています;-) – pferrel

0

またはemptyの状態を持つ別のcase classにロジックを抽出することができます。今あなたが更新する必要があり、すべてが空の状態、および実行され

def par(input: ParInput = ParInput.empty) = { 
    require(min > 0 || exact > 0 || auto, "Invalid argument") 
    OpPar(drm, minSplits = input.min, exactSplits = input.exact) 
} 

def par(
    min: Option[Int] = None, 
    exact: Option[Int] = None, 
    auto: Option[Boolean] = None 
): OpPar = { 
    val input = ParInput(min, exact, auto) 
    // now call the original library method. 
    par(drm, input.min, input.exact) 
} 

case class ParInput(min: Int, exact: Int, auto: Boolean) 

object ParInput { 
    def apply(min: Option[Int], exact: Option[Int], auto: Option[Boolean]) = { 

    ParInput(
     min.getOrElse(empty.min), 
     exact.getOrElse(empty.exact), 
     auto.getOrElse(empty.auto) 
    ) 
    } 
    val empty = ParInput(-1, -1, false) 
} 

は、ここでは、この残りのです。あなたは無料のモノイドを手に入れます。

+0

@KevinMeredithはい私は同意します。 – flavian

+0

しかし、これは問題を解決しません、それは単にそれを移動します。問題は、 'minPar == None'なら' par'のデフォルトを使いたいということをScalaで表現する方法がないようです。言い換えれば、私が探している解決策には "-1"または "false"が含まれていません。私は、スカラのlibsを使用しているときに頻繁に出現するように思われるので、「呼び出された関数のデフォルトを使用する」という特殊な値があるかもしれないと思います。 – pferrel

+0

@pferrel更新されました。私は何かが欠けていないことを願っていますが、これはあなたの問題を解決するはずです。 – flavian

関連する問題