2016-09-06 18 views
0

私は以下の列挙型を持っています。Scala:動的契約を引数として持つ関数

object Smth extends Enumeration { 
    class Value(name: String, func: (String, Int) => Boolean) extends super.Val(name) 

    private def opA(index: Int) : Boolean ={ 
     index > 0 
    } 
    private def opB(x: String, index: Int) : Boolean ={ 
     index > 0 && x.length > 0 
    } 

    val x = new Value("X", opA) // type mismatch error for opA 
    val y = new Value("Y", opB) 
} 

列挙コンストラクタはタイプ(String, Int) => Booleanの、引数として関数を取ります。私は、関数定義では、引数のデフォルト値を使用しないようにしようとしています

(String, Int) => Boolean 
(Int) => Boolean 

:それは例えば、2つの異なる契約に機能を受け入れるように列挙型のコンストラクタを作成することが可能です。

これは使い方です。

if(Smth.x.func(0)) { do smth } 
else if(Smth.y.func("str", 0)) { do smthElse } 
+0

ちょうど別のコンストラクタを追加します。 – talex

+0

適用メソッドを追加すると、class.value(name:String、func:(Int)=> Boolean) (String、Int)=> Boolean' – tmp123

+0

私は答えとして提案を投稿します。 – talex

答えて

0

あなたはちょうどあなたがこれを行うことができ、デフォルト値が必要な場合:

class Value(val name: String, val func: (String, Int) => Boolean) extends super.Val(name) { 
    def apply(name: String, func: (Int) => Boolean): Value = 
     new Value(name, (x -> func("default value", x))) 
} 
+0

私はデフォルト値を避けようとしており、それを行う方法は他にありませんかと不思議に思っていました。コンテキストを追加して質問を更新します。 – tmp123

+0

2つの別々のクラスが必要なのでしょうか? – talex

+0

これを単一の「エンティティ」にグループ化するのが好きなキャッチです。 – tmp123

関連する問題