関数オブジェクト(Scala)

2875 ワード

関数オブジェクト
Rationalクラスを例に、クラスパラメータ、構築方法、メソッド、オペレータ、プライベートメンバー、書き換え、事前条件チェック、リロード、および自己参照について説明します.
可変オブジェクトと可変オブジェクトの違い
可変オブジェクトは通常、可変オブジェクトよりも推理しやすく、時間の変化に伴って変化せず、複雑な状態空間はありません.次に、可変オブジェクトを自由に渡すことができます.可変オブジェクトの場合、転送する前に保護的なコピーが必要です.可変オブジェクトは、ハッシュ・テーブルのキーとして安全に使用できます.劣勢は、可変オブジェクトには大きなオブジェクト図が必要です.
構築Rationalクラス
class Rational(n : Int, d : Int)

Javaとは異なり、クラスはパラメータを受信できることがわかります.Javaでは構築方法があり,構築方法はパラメータを受信する.
書き換え実装toStringメソッド
RationalクラスにtoStringメソッドを追加することで、デフォルトのインプリメンテーションを書き換えることができます.
class Rational(n:Int,d:ing) {
    override def toString = n + "/" + d
}

事前条件の確認
可変オブジェクトの場合は、構築時にオブジェクトが正当であることを確認します.例えば有理数は0に分母できない.入力パラメータdが0の場合、オブジェクトの生成は禁止されるべきである.この問題を解決するには,主構造法に対して前置条件を定義する.
class Rational (n : Int, d : Int) {
    required(d != 0)
    override def toString = n + "/" + d
}

requireメソッドはbooleanパラメータを受信し、trueに入力し、正常に戻り、falseに入力し、IllegalArgumentException異常を飛び出します.
フィールドの追加
別のRationalクラスを受信するaddメソッドを定義し、可変特性を維持するために、addメソッドはこの2つのRationalクラスの和に等しい別のRationalクラスを作成する必要があります.
class Rational (n : Int, d : Int) {
    required(d != 0)
    val numer:Int = n
    val denom:Int = d
    override def toString = n + "/" + d
    def add(that : Rational) : Rational = 
        new Rational(
            numer * that.denom + that.numer * denom,
            denom * that.denom
        )
}

thatは使用できません.nとthat.dは実現する.thatの分子と分母にアクセスするには、フィールドにします.
構築方法
クラスは複数の構築方法を定義します.Scalaでは,主構造法以外の構造法を補助構造法と呼ぶ.例えばRationalクラスは1つのパラメータ,すなわち分子のみを受信する.分母は1として予め定義する.
//  this,        。
def this(n:Int) = this(n,1)

プライベートフィールドとメソッド
例えばRational類を正規化し,分子と分母を最大公約数で割る.
class Rational (n : Int, d : Int) {
    required(d != 0)
    private val g = gcd(n.abs, d.abs)
    val numer:Int = n / g
    val denom:Int = d / g
    def this(n:Int) = this(n,1)
    override def toString = n + "/" + d
    def add(that : Rational) : Rational = 
        new Rational(
            numer * that.denom + that.numer * denom,
            denom * that.denom
        )
    private def gcd(a:Int, b:Int) : Int = 
        if (b==0) a else gcd(b, a % b)
}

オペレータの定義
x.add(y)をx+yに変換します.
//  
def + (that: Rational):Rational = 
    new Rational(
        numer * that.denom + that.numer * denom,
            denom * that.denom
    )
//  
def * (that: Rational):Rational = 
    new Rational(
        numer * that.numer,
        denom * that.denom
    )

メソッドの再ロード
+を例にとると、右操作元は、有理数であるか整数であるかのいずれかである.
def + (that: Rational):Rational = 
    new Rational(
        numer * that.denom + that.numer * denom,
            denom * that.denom
    )
def + (i: Int) = 
    new Rational(numer + i * denom, denom)