2012-05-02 13 views
0

Scalaはクールです。しかし、時には、私が期待しているようにうまくいかないものばかりでなく、一見自発的な制限のために非常にイライラすることもあります。Scalaの複数の独立したimplicits

この場合、Scalaで引数解析ライブラリを作成しました。

def option[T](
    name1: String, name2: String = null, name3: String = null, 
    name4: String = null, name5: String = null, name6: String = null, 
    name7: String = null, name8: String = null, name9: String = null, 
    default: T = null.asInstanceOf[T], 
    metavar: String = null, 
    choices: Seq[T] = null, 
    aliases: Map[T, Iterable[T]] = null, 
    help: String = "") 
(implicit convert: (String, String, ArgParser) => T, m: Manifest[T]) = { 
    optionSeq[T](nonNullVals(name1, name2, name3, name4, name5, name6, 
    name7, name8, name9), 
    metavar = metavar, default = default, choices = choices, 
    aliases = aliases, help = help)(convert, m) 
} 

は基本的に、これは与えられたタイプの通常のオプション引数を宣言しています。それは、この機能を持っています。型に適切な既定のコンバータで塗りつぶされる暗黙の関数があります。暗黙的なマニフェストもあります。なぜなら、私は、特定のことについてそれを条件付けできる必要があるからです。

これは実際にデフォルト以外のコンバータを提供しようとするまで機能しました。書かれているように、あなたはコンバータを供給するだけではなく、マニフェストを供給する必要があります。私はそれを行う方法がわかりません。とにかくひどく醜いのです。マニフェストは、 JVM内の壊れた部分であり、エンドユーザーに公開されるべきではありません。

Scalaでは、暗黙の引数と暗黙的でない引数を1つの引数リストに混在させることはできません.IMOは任意かつ不必要な制限ですが、そうであってもかまいません。だから私は暗黙的な引数リストを2つの別々の引数リストに分割しようとしました。不運 - Scalaは、複数の暗黙的な引数リスト(別の見かけ上の任意の制限)を持たないようにも思えます。

私はこれを回避する方法を考えていません。提案?

今後のScalaバージョンでは、これらの制限の一部を修正する現行の試みはありますか(および/または、IMOが突然醜悪であるマニフェストよりも型消滅の脆弱性を回避する目に見えない方法を考え出しています。 )?

答えて

3

で、それだけでdef implicitly[T](implicit e: T) = eで、魔法ではありません非常に厄介な方法。 9つの明示的な名前の引数?変換関数の暗黙の選択?マニフェストがここで最悪の問題であるかどうかはわかりません。

とにかく、あなたは

class Converter[T: Manifest](val f: (String, String, ArgParser) => T) { 
    def m = manifest[T] 
} 
implicit def function_to_converter[T: Manifest](f: (String, String, ArgParser) => T) = 
    new Converter { def apply(s1: String, s2: String, ap: ArgParser) = f(s1,s2,ap) } 
} 

、その後は代わりに二つの引数のあなたが持っていることを使用することができます。

implicit val convert_to_int: Converter = (s1: String, s2: String, ap: ArgParser) => ... 

、ユーザーが明示的に1を記入する必要がある場合、その後、彼らは単に機能を提供し、それは暗黙的に変換することができますように、すべてのデフォルトのコンバータを定義します。

+0

ありがとう、私はそれを試してみましょう。 Scalaの非機能を回避しようとしているので、やっかいです。 'option [Int](" ngram "、" n-gram "、default = 3、help =" "something" "")という名前の引数を加えて、1つ以上の名前を宣言できるようにしたい。 ) '。 –

3

implicitly[T]という文脈で、Timplicitをいつでも得ることができます。コンパイラが提供する暗黙的なManifest[T]を明示的に書く必要がある場合は、implicitly[Manifest[T]]でそれを行うことができます。

これは、暗黙的なパラメータリストに引数を指定し、変更しない引数に暗黙的に[TheTypeOfTheImplicit]を使用する場合にのみ有効です。マニフェストについては

は、Predefはちょうどmanifest[T]になるためのショートカット、持っていることを起こる(あるだけimplicitly[Manifest[T]]

注:implicitlyですPredef.

+0

ありがとうございました。私は明示的にマニフェストを記入しなければならないことを避けたいと思っています。だから私は他の答えを受け入れた。 –

関連する問題