:サンプルクラスは、キーワードクラスのケースを使用して宣言され、使用の一般的なカテゴリーは同じです。
パッケージサンプルクラスとパターンマッチング / ** * @author:Alex_lei * @description: * / オブジェクトCase_class { / ** *人々はサンプルクラスです * @param name属性に名前を付ける * @param年齢age属性 * / ケース階級の人々 (名:文字列、年齢:INT) DEFメイン(引数:配列[文字列]):単位= { ヴァル人P1 =( "アレックス"、23である) のVal人P2 =( "リリー"、22である) のprintln(P1) } }
2:パターンマッチング
ワイルドカード、一定モード、可変モード、設定モード、シーケンシャルモードタプルパターン、パターン・タイプ:モードに分けられます。
コード例:
一致するサンプルパッケージの種類やパターン のインポート数学{E、パイを}。 / ** * @author:Alex_lei * @description:パターンのいくつかのタイプ * / オブジェクトモード{ ケースクラスの人(名前:文字列、年齢:INT) DEFメイン(引数:配列[文字列]):単位= { / ** *テストワイルドカード * / (3)CATCH_ALL のprintln((DESCRIBE 5)) / ** *この場合の変数モード3は、piは可変モードです、それは任意の値を一致させることができますので、その後の値が一致していません。 * / ヴァルPIパイ= ヴァルE RES = {マッチ ケースPI => "PI" ケース_ => "OK" } のprintln(RES) / ** *テストコンフィギュレーションモード * / ヴァル人P =( "アレックス"、 22) Constructor_mode(P) / ** * 5。このようなマッチング型のリストまたはアレイとして配列パターン、 * / ヴァル= Lリスト(1,2,3) Lマッチ{ ケースリスト(_、_、_)=>のprintln( "リスト") ケース_ =>のprintln( "何か") } / ** * 6タプルパターン * / ヴァルT =(1、 "アレックス"、22れる) T {マッチ ケース(_、_、_) => printlnを( "タプル") ケース_ => printlnを( "何か他の") } / ** *型テスト・モード * / ヴァルS = "アレックス" type_mode(S) ヴァルマップM =(1 - 。> '2' 2 - > '3') type_mode(M) ヴァルM1 =マップ( "アレックス" - > "名前"、 "リリー" - > "NAME1") のprintln(ショー(M1のGET」アレックス")) } / ** 1. *ワイルドカード記号:_任意のオブジェクトに一致する * / DEF CATCH_ALL(A:INT):単位= { {一致 。ケース1 =>のprintln( 'A')は ケース2 =>のprintln( 'C') ケース_ =>のprintln(「_」) } } / ** * 2.一定モード:一定の定数及びValまたはシングルトン定数の基本的なタイプを一致させるために使用さを用いてもよいです。 @param X * * / DEF DESCRIBE(X:任意)= { X {マッチ 。ケース5 => "ファイブ" にケース真=> "真実" ケース"こんにちは" => "こんにちは" ケース=> "空のList"無記号 _ =ケース> "何か他の" } } / ** *。4。 * / P一致{ ケース人(_、_)=>のprintln( "人") 場合_ =>のprintln( "任意") } } / ** * 7类型模式 * @param X * / DEF type_mode(X:任意)= { X一致{ ケースS:文字列=>のprintln(s.length) 場合、M:地図[_、_] =>のprintln(m.size) 場合_ =>のprintln( "何か") } } DEFショー(X:オプション[文字列])は、x一致{= ケースの一部(S)=> S ケースなし=> "?"を } }
3:ガードモード
処置:主に、より正確なマッチングモードに、主な症状は試合にいくつかのフィルタを追加することです。
コード例:
サンプルパッケージタイプとパターンマッチング / ** * @author:Alex_lei * @description:ガードモード、主に、より正確にパターンを一致させるために * / Mode_guard {オブジェクト DEFメイン(引数:配列[文字列]):単位= { / * * *テストパターンガード * / ヴァルA = -10 :印刷( "A = -10") 、M(A) ヴァルB = 10 プリント( "B = 10:") 、M(B) ヴァルS = "ABC" 印刷( "S = ABC") M(S) ヴァルT = "A" 印刷( "T = A") M(T) } DEFのM(X:任意)= X一致{ ケースX:のInt IF X> = 0>のprintln( "INT") ケースX:文字列IF x.length> 2 =>println( "文字列") ケース_ =>のprintln( "ANY") } }
4:オプションタイプ
2種類のみのオプションタイプ値の一部(x)は、xが実際の値であり、オブジェクトはNoneにできる場合、一部となし、そのサブクラスは、最終的なを使用して修飾されており、そこにサブクラス化することができないことができます。
コード例:
サンプルパッケージタイプとパターンマッチング / ** * @author:Alex_lei * @description:2種類のみのオプションタイプ値は、xが実際の値であり、オブジェクトはNoneにしてもよい(X)、ここで、s一部であってもよい *一部となしですそのサブクラス、最終的な変形が使用され、そこサブクラス化することができる * / オブジェクト{Option- DEFメイン(引数:配列[文字列]):単位= { ヴァル予約地図=(「Hadoopの」 - > 10、「スパーク" - > 30、"スカラ" - > 40)FLINK - "> 20であり、" ヴァルbook.get T =(" [intは= Hadoopの「)//オプションは、一部の(10)の戻り値は、[INTは】入力オプションはS のprintln (T)は、 / ** 戻り値がある場合*以下の2つの例を示し、その結果、パラメータを返されないgetOrElse *戻り値は、結果はリターンパラメータgetOrElseないであろう場合 * / ヴァルT1 = book.get ( "HBaseの")。getOrElse( "いいえキー")//ませキー のprintln(T1) ヴァル・T2 = book.getない( "スパーク")。getOrElse( "はい")// 20 println(T2) } }
5:囲むクラス
我々はサンプルクラスで行う際に、パターンマッチング、パターンマッチングのための密封されたキーワードを使用して、クラスを囲む、コンパイラは、私たちはすべての可能な一覧表示するようにしてください聞かせて、私たちは、スーパークラスが閉鎖されるサンプリングする必要があります。パターンマッチングは、それが必要な場合でも、網羅小切手のその後のパターンのための機能をマッチング@unchecked表現の後ろにコメントを追加するには、抑制されていたであろう。警告は表示されません。
コード例:
パッケージのサンプルクラスとパターンマッチング / ** * @author:Alex_lei * @description:クローズドクラス、パターンマッチングのための密封されたキーワードを使用して、我々が使用 行うためにパターンマッチング*サンプルクラスを、そのコンパイラを確実に私たちを助けたいですすべてのリスト の可能*、我々はスーパークローズさをサンプリングする必要があります。 * / オブジェクト密閉{ DEFメイン(引数:配列[文字列]):単位= { ヴァルナンバーTは=(2) ヴァルは、RESの=(T)を記述 のprintln(RES) DES(T) DESC(T) } / ** *警告:月の試合は網羅されていない(16、33です)。 *これは、以下の入力に失敗します:、UNOPを(_、_)binop(_、_、_) * DEF DESCRIBE(X:expr)は:文字列= Xの試合{ * *書かれた警告は、二つの可能性があることが表示されます * *解決するには、2つの方法、すなわちデDESCの機能と機能があります *デプラスワイルドカードでの主機能は、 * DESC機能は、貧しい人々のその後のパターンのために、@unchecked表現の背後にあるコメントが一致する機能を追加することですチェックのためにスケルチされる * / DEF DESCRIBE(X:expr)は:文字列= Xマッチ{ ケース番号(_)=> "番号" ケースヴァー(_)=> "A文字列" } DEF DES(X: expr)は:文字列= X一致{ ケースナンバー(_)=> "番号" ケースヴァー(_)=> "A文字列" 事例_ =>投新しい新規のRuntimeException } DEFのDESC(X:expr)は:文字列=(X :@unchecked)マッチ{ ケースナンバー(_)=> "番号" ケースヴァー(_)=> "A文字列" } } / ** *クローズドクラスExprに定義 * / 封印された抽象クラスのExprを ** / *定義する4つのサンプルクラスがEXPR継承 * * / ケースクラスヴァール(名前:String)をExprに拡張 :Exprに拡張するケース番号クラス(ダブルNUM)は ケースクラスUNOP(:文字列、引数:演算子をexpr)はExprに拡張する ケースクラスbinop(演算子を:文字列は、左:Exprに、右 :exprが)Exprにを拡張します