2012-03-02 5 views
3

以下は、実際に私の言語を理解するためのものです。Scalaで新しい部分関数型を宣言する方法

新しい特定の部分関数型をどのように宣言できますか。部分的に定義された多くの関数を宣言し、MyClassクラスを取り込んで文字列を返す必要があるとしましょう。私が試してみると:

class mypf extends PartialFunction[MyClass, String] 
val myinstance: mypf = { case ... } 

スカラはmypfが抽象的でなければならないと言っています。どうすればいい?それを完全にするのは悪い考えですか?もしそうなら、なぜですか?

答えて

8

、それがその特定の場合に役立つ可能性があり、一般的に、あなたの問題を解決していませんが:

scala> type mypf = PartialFunction[Int, String] 
defined type alias mypf 

// type alias for PartialFunction 

scala> val x: mypf = {case x: Int if x > 10 => "More than ten"} 
x: mypf = <function1> 
+1

ありがとうございました。私は "タイプ"のキーワードを見落としていました。それが問題でした。 – eje211

6

何をしたいことがちょうどPartialFuncion [MyClassの、文字列]の別名を持つことがある場合は、あなたが行う必要があります

type MyPf = PartialFunction[MyClass, String] 

この宣言はトップレベルではできません。オブジェクト内にある必要があります。最上位の宣言のように見えるようにするには、その型をパッケージオブジェクトで宣言できます。

abstract class mypf extends PartialFunction[MyClass, String] 

合法であること、さらに少し移動するには(それが明確に抽象的でなければならない、それが適用されますの実装を欠いており、定義されます)。しかし、{case x => ...}のような式は、あなたのタイプではなくPartialFunctionタイプになるので、あなたのタイプは便利ではありません。

リテラルを失うことなく、エイリアスを取得するために継承を使用することは、限られています。 class MyClass extends Something<With, Lots, Of, Parameters>を実行する場合は、MyClassがインスタンスの作成時に役立ちますが、MyClassタイプのメソッドパラメータを宣言すると、メソッドを過度に制限することができなくなります。

2

PartialFunctionは、入力ドメイン全体に対して定義する必要はないため、特性は抽象としてapplyisDefinedAtの両方を定義します。 は、このようにあなたがそうのような上記の方法を実装する必要があります。

val myInstance = new PartialFunction[Int, String] { 
    override def apply(i: Int): String = { 
    if (i < 100) 
     "Valid " + i 
    else 
     "Undefined" 
    } 

    override def isDefinedAt(i: Int): Boolean = i < 100 
} 

明示的overrideを言う必要はありませんが、時々そうすると便利です。

関連する問題