リスト - みる会図書館


検索対象: ななか+Inside PRESS 2012 夏
21件見つかりました。

1. ななか+Inside PRESS 2012 夏

3.2 クラスが簡潔に書ける セスできないパッケージプライベートですが、 Scala では何も記述しなければ public です。 リスト 7 Money クラス package money import j ava. util . Currency 行でクラスを定義できるわけです。このクラスを利用して、 100 円を表すコードを書くとリスト 9 記述も冗長です。この冗長さを取り除いて書いたのが、リスト 7 です。とても簡潔に、たった 1 るわけです。さらに、コンストラクタの引数とフィールドは一対一対応しているので、このような り、クラス宣言部とコンストラクタ宣言部をまとめて記述することで、簡潔で明瞭なコードを書け でもあります。この例では、コンストラクタの引数から val フィールドに代入しています * 6 。つま ストラクタ (primaryconstructor) と呼びます。また、このプロックはフィールド宣言のプロック し、 ( 1 ) のプロックがコンストラクタの処理プロックとなります。このコンストラクタを基本コン 記述したのがリスト 8 です。 Scala では、クラス名の後ろにコンストラクタの引数の仕様を記述 は、理解しにくいと思うので、段階を追って解説しましよう。リスト 7 のコードを省略しないで 円やドルなどそのお金の単位 ( 通貨単位 ) を表す Currency 型の currency です新。この説明だけで Money クラスには、二つの属性があります、 4 。金額の量を表す BigDecimal 型の amount と、 } 〃← currency = creny va1 amount = amnt class Money (amnt : BigDecima1 , creny : Currency) { / / ーー > 0 ) リスト 8 M 。 ney クラス ( 省略しないで書いたもの ) class Money (val amount : BigDecima1 , va1 currency : Currency) val money = new Money(100 , currency) / / プ 00 円 val currency = Currency. getlnstance ( " JPY" ) / / 円の通貨単位 リスト 9 100 円を表すコード のようになります。 println (money. amount) println(money. currency) / / プ 00 〃 JPY リスト 10 100 円と 50 円を加算した結果が 150 円になっているかを検証するテストコード。 Money クラスの plus メソッドはまだ存在しないので実行するとエラーになる * 4Scala ではクラス宣言だけでなく、フィールド宣言のデフォルトのアクセス修飾子も public です。 * 5 java. util.Currency クラスは通貨単位を表すクラスです。例えば、 val currency rency. getlnstance( ” JPY ” ) のようにすると円の通貨単位を取得できます。 、 6val のフィールドは Java の publicfinal フィールドに相当します。 Cur- ◆ 13 ななか十 inside press

2. ななか+Inside PRESS 2012 夏

5.2 高階関数を使って繰り返し処理を作る しいインスタンスを返すことになっています、 12 ( リスト 24 ) 。 それでは、この List の各要素を表示する処理を記述してみましよう。二通りの書き方を示しま す。ーっは Java などと同様の命令型の考え方に基づく書き方 ( リスト 25 ) 、 val val val 文と同じように要素を順次取り出す書き方です ( リスト 26 ) 。 : numbers / / 先頭に 0 に追加。 s カ ( の 0 + : numbers / / 先頭に 0 に追加。 List(O, , 2 , 3 ) リスト 24 要素を追加する例 val newNumbers2 val newNumbers 1 val numbers = List ( 1 newNumbers4 = numbers : + 4 / / 末尾にイを追加。を st ( プ , 〃↑末尾に s カ 4 , 5 ) を追加。 List(), 2 , 3 , イ , 5 ) newNumbers3 = numbers + + List(), 5 ) 2 , もうーっが拡張 for 2 , 3 ) 2 , 3 ) 3 , イ ) リスト 25 List の各要素を表示する二通りの方法 ( Java の f 。 r 文に相当する書き方 ) numbers = List ( 1 , 2 , 3 , 4 , 5 ) / / Ja セ 0 の″工 0 ( れ t を = 0 , ・をくれ m と e s ユ e れ gt ん , ・を + + ) { ″に相当 for(i く一 0 until numbers . length) { println(numbers(i)) 〃添え字で要素を取得 リスト 26 List の各要素を表示する二通りの方法 ( Java の拡張 f 。 r 文に相当する書き方 ) val numbers = Li st ( 1 , 2 , 3 , 4 , 5 ) / / 五セ 0 の〃工 or ( e 乙 eme れカ : れし ers ) { ″に相当 f0 て (number く一 numbers) { println(number) 5.2 高階関数を使って繰り返し処理を作る List には foreach メソッドという高階関数があります。リスト 27 の例では、 foreach メソッド の引数には、無名関数を与えています。この無名関数の型は、その要素型である lnt を引数に取 り、戻り値は U ⅲ t です。これを要素ごとに呼び出して繰り返し処理を実現します。 リスト 27 List の foreach メソッドを使って要素を表示する List を得るには filiterNot メソッドを使うとよいでしよう。 * 12List 同士の連結には十十演算子以外に : : : 演算子も利用可能です。また、 List から不要な要素を取り除いた新たな numbers. foreach( (number : lnt) = > println(number) ) val numbers = List ( 1 , 2 , 3 , 4 , 5 ) ななか十 inside press ◆ 23

3. ななか+Inside PRESS 2012 夏

3.2 3.2.3 Money クラスに p ん s メソッドを追加する クラスが簡潔に書ける いよいよ、 oney クラスに plus メソッドを実装してみましよう ( リスト 11 ) 。 other の currency と、現在の currency が同じ値であることを require メソッドで検証しています。この条件に反す ると require メソッドは IIIegaIArgumentException をスローします。同じ通貨単位であれば、現 在の amount と other の amount を加算した値を持つ新しい Money を生成して戻り値として返 します。この plus メソッドを使えば、リスト 10 で示したテストコードが実行できるはずです。 リスト 11 plus メソッドを実装した Money クラス class Money (val amount : BigDecima1 , val currency : Currency) { def plus(other: Money) (other. currency currency) new Money(amount 十 Other. amount , currency) override def equals (obj : Any) case that : Money = > that . amount & & currency amount = > false 0bj mat ch { that . currency / / equaLs を再定義する場合は hashCode も再定義する override def hashCode = amount . hashCode + currency. hashCode 3.2.4 補助コンストラクタを実装する Money クラスの例では、初期化時にいちいち Currency を指定するのは面倒です。コンストラ クタの Currency を省略したい場合は、 Currency. getInstance(Locale. getDefault) を利用するよ うに実装するとよいでしよう ( リスト 12 ) 。 リスト 12 ほとんどの場合で次のようにして円の通貨単位を扱える val currency = Currency. getlnstance (Loca1e. getDefau1t) val a = new MO Ⅱ ey ( 100 , currency) / / プ 00 円 Java では、コンストラクタをオーバーロードして Currency を省略するように実装できます。 ScaIa の場合でもリスト 13 のようにして引数の異なるコンストラクタを定義できます。これを補 助コンストラクタ (auxiliaryconstructor) を呼びます、 9 。そのテストコードをリスト 14 に示し * 9 補助コンストラクタは、最終的に基本コンストラクタを呼び出す必要があります。また、基本コンストラクタ に、以下のようにデフォルト引数を指定する方法もあります。デフォルト引数とは引数が指定されなかった場 ななか十 inside press ◆ 15

4. ななか+Inside PRESS 2012 夏

4 応用編・関数型の機能を学ぶ , こで学ぶこと トレイト ケースクラス ・パターンマッチ (match 式 ) 第一級オプジェクトとしての関数 (x : lnt) = > x * x 場したメソッド * 11 はクラスに従属しますが、関数は単独で利用できます。例えば、 つ以上の引数を取り、一つの結果 ( 戻り値 ) を生成する役割を持っオプジェクトです。基礎編で登 応用編ではまず、関数型言語の「関数」とはそもそもどういう概念かを説明します。関数は、 va1 result = x * x println(result) result val squareDebug 〃コードプロックが複数行の場合 ( { } が必要 ) val square (x : lnt ) = > x * x 〃セ変数名 = 引数のリスト = > コードプロック リスト 21 関数を変数に代入する例 す。高階関数を利用することで、命令型言語では表現できないシンプルなコードが記述可能です。 数の引数や戻り値に利用できます。このように関数を利用する関数のことを「高階関数」と呼びま なので、プログラマの負担が軽減されます。関数はまた、リスト 23 のように通常の値と同様、関 引数や戻り値に間違った型を指定するとコンパイルエラーとなります。「型安全」 ( タイプセーフ ) 定義されたことがわかります。定義した関数は、リスト 22 のようにして呼び出せます。定義した に代入する例です。 square に代入された関数は、 lnt 型の引数と、 lnt 型の戻り値を持っ型として、 性質を持つオプジェクトを「第一級オプジェクト」といいます。例えば、リスト 21 は関数を変数 数の戻り値として返したりと、基本的な操作を制限なく行える一人前のオプジェクトです。この 関数型言語での関数は、他の値と同様、変数に代人したり、別の関数の引数として渡したり、関 4 ユ関数を変数に代入したり引数で渡せる 関数」といいます。 り値 ) を生成する関数を示します。また、この関数リテラルで記述される名前のない関数を「無名 は、「関数リテラル」と呼ばれる記述方法で、この例は lnt の引数を取り、それを二乗した結果 ( 戻 * 11 def キーワードで宣言するメソッドのことです。 ななか十 inside press ◆ 21

5. ななか+Inside PRESS 2012 夏

6 ScaIa プログラミングに欠かせない機能 , こからは、 ScaIa プログラミングに欠かせない「パターンマッチ」と、独自機能である「ケー スクラス」、そして「トレイト」について説明します。 6.1 match 式による柔軟なパターンマッチ ななか十 inside press ◆ 25 case " 2 " = > "two" 〃文字列の値の場合 case n:lnt = > 'tone" / / 工れ t 型の場合 0bj match { def convertNumberToString(0bj : Any) リスト 29 match 式は値を返す numberMatch(4) / / 0t れ e numberMatch(3) / / t 出 0 0 three numberMatch(2) / / t 田 0 0 three numberMatch(I) / / 0 れ e C e = > println("other") case 2 ー 3 = > println("two or three") case 1 = > println(t'one't) def numberMatch(n : lnt) = Ⅱ match { リスト 28 数値のマッチングの例 を返すことができます。 = > の後で最後に評価された式の値を戻り値として返せます。 List 型の条件を指定して文字列を返しています。リスト 29 で見たように、 match 式では戻り値 字列やコレクション、型によるマッチングが可能です。リスト 29 の例では lnt 型や文字列の値、 はワイルドカードといって、 switch 文の default: に相当します。また、 Scala の match 式では、文 case 1 で変数 n が 1 に該当すれば = > の次の処理の println("one") が実行されます。また、 case ー た case を処理したら、他の case を処理せずに match 式の制御を抜けます。例えば、この例では、 述しなければ後続の選択肢の処理を実行しますが、 match 式では break はありません。マッチし 用し、 case による選択肢は上から下へと順番に検証されます。 Java の switch 文では break を記 数値でのマッチの例がリスト 28 です。変数 n ( セレクターと呼びます ) に対して、 match 式を適 6.2 数値や文字列などでマッチング可能 match 式を利用します。 ができ、 Scala プログラミングの中心的な役割を担います。パターンマッチの処理を記述するには ターンマッチは多くの言語で採用されていますが、 ScaIa のものは様々な条件にマッチさせること ScaIa のパターンマッチは、 Java の switch 文をより強化した場合分けの機能を提供します。パ

6. ななか+Inside PRESS 2012 夏

3.2 クラスが簡潔に書ける ジェクトのコンストラクタには引数を持っことができないことです。例えば、リスト 15 は従業 員 (Employee) を読み書きできる、データベース管理システムのテープルを表すオプジェクト (EmployeeTabIe) の例です。 リスト 15 データベース管理システムのテープルを表すオプジェクトの例 〃従業員クラス class Emp10yee (val name : String) 〃従業員テープルオプジェクト 0bj ect Emp10yeeTab1e { def insert (table : Emp10yee) :Unit def se1ectA11 : List [Emp10yee] / / れ e 出 E 乙 0 eeTa e ではなく、 E 乙 0 eeT 乙 e とすると / / 常に同一のインスタンスが返される val emp10yeeTab1e = Emp10yeeTab1e emp10yeeTab1e. insert (new Emp10yee ( " Junichi Kat0" ) ) emp10yeeTabIe . se1ectAII val employees 3.2.6 コンパニオンオプジェクトで非公開メンバーに相互アクセス Money クラスの例に戻りましよう。 Money クラス用の定数フィールドを定義するにはオプジェ クトを使うわけですが、その際、コンパニオンオプジェクトという形式で定義します。コンパニオ ンオプジェクトとは、同じファイルや同じパッケージ内でクラスと同じ名前で定義されたオプジェ クトのことを指します。また、対になっているクラスをコンパニオンクラスと呼びます * 10 。コン パニオンクラスとコンパニオンオプジェクトを使うメリットは、お互いの非公開メンバー ( フィー ルドとメソッドの両方 ) にアクセスできることです。リスト 16 の例では、コンパニオンとなるク ラスとオプジェクトを同一ファイルに定義しています。 コンパニオンオプジェクトのフィールドを使えば static フィールド相当のことができます ( リス ト 17 ) 。お互いの非公開メンバーへのアクセスは、リスト 12 の例で見てみましよう。 Money オプ ジェクトの DEFAULT-CURRENCY には、 Money クラスからアクセス可能です。また、 Money クラスの amount には、 Money オプジェクトからアクセス可能です。 * 10 Java では名前空間の衝突が発生してしまいますが、 ScaIa の場合は発生しません。 / / コンパニオンクラス import java . util . Loca1e import java. util . Currency package money ファイルに定義する リスト 16 コンパニオンオプジェクトの例。 ななか十 inside press ◆ 17 コンパニオンとなるクラスとオプジェクトを同一

7. ななか+Inside PRESS 2012 夏

3.2 クラスが簡潔に書ける class Money(var amount : BigDecima1 , def this (amount : BigDecima1) def plus (other : Money) currency Currency) { / / コンパニオンオプジェクト ( 必ず同一ファイルに定義する ) object Money { val USD = Currency. getlnstance ( "USD") val JPY = Currency. getlnstance ( " JPY") val money = new Money(100 , Money. JPY) リスト 17 第二引数にコンパニオンオプジェクトのフィールドを指定 / / コンパニオンクラス amount と DEFAULT-CURRENCY は共に private であることに注目 リスト 18 コンパニオンオプジェクトを使えばお互いの非公開メンバーにアクセスできる。 val JPY = Currency. getInstance("JPY") / / デフォルトの C 社 e れ c val USD = Currency. getInstance("USD") object Money { / / コンパニオンオプジェクト 〃以下、省略 def this (amount : BigDecima1) this (amount , Money. DEFAULT—CURRENCY) class Money(private va1 amount : BigDecima1 , val currency : Currency) { private val DEFAULT—CURRENCY def sum(monies : List [Money] ) var result : BigDecima1 for(money く一 monies){ result 十 = money . amount new Money(resu1t) JPY 〃すべてのれ e の合計を返す リスト 19 コンパニオンオプジェクト内部にファクトリメソッド (apply メソッド ) を定義する package money ななか十 inside press ◆ 18

8. ななか+Inside PRESS 2012 夏

〃お金の量 private final BigDecima1 amount ; 〃通貨の単位 private final Currency currency ; public Money (BigDecima1 amnt , Currency creny) { amount = amt ; currency = creny ; public BigDecima1 getAmount ( ) { return amount ; public Currency getCurrency ( ) { return currency ; 」 ava の資産を生かせる リスト 1 では通貨の単位を表す java. util.Currency が利用されています。 scala は実行環境に Java 仮想マシン (JavaVM) を利用するため、 Scala プログラムから Java の機能をシームレスに 利用することができるのです。このように Java との親和性が高いのも大きな特徴です。 Java プ ログラマにとっては、オプジェクト指向の知識を生かしつつ関数型言語の考え方をスムーズに取り 入れながら、 Java の資産も利用できるわけです。こうして見てくると、 Java プログラマが scala に注目するのも当然のように思えてきませんか。 Scala は、 Java プログラマが次に学ぶに値する 言語です。より品質の高いプログラムを書けるようになるために scala の知識はきっと役立ちま す。早速、開発実行環境を整備して、 Scala のプログラミングスタイルを見ていきましよう。 1 統合開発環境の整備 まずは、 Scala の開発環境を PC にインストールしましよう。前提条件を表 1 にまとめました のでお手元の PC のシステム環境を確認しておいてください。例えば、リスト 3 に示すコマンド (java -version) を実行することにより、 Java のバージョンが確認できます。 リスト 3 Java のバージョンを確認する方法 $ j ava —version ななか十 inside press

9. ななか+Inside PRESS 2012 夏

第一部 はじめての Sca 早わかりガイド この 1 ~ 2 年、開発者のコミュニティなどで着実に人気が高まっているプログラミング言語が 「 Scala ( スカラ、スケーラと読みます ) 」です。本特集では、 Java プログラマ ( 見習いも含みま す ) に向けて、 ScaIa をなるべく簡潔にわかりやすくお伝えします。 Scala は、スイス連邦工科大学ローザンヌ校の Mart ⅲ Odersky( マーティン・オーダスキー ) 教 授率いるチームが開発しているプログラミング言語です。オープンソース ( BSD ライセンスに似 た SCALALICENSE ) で開発・公開されており、その範囲内で自由に利用できます。最初に、 " な ぜ、 Scala の人気が高まっているのか " を説明します。 オプジェクト指向と関数型の特徴を備える Scala は、オプジェクト指向に加えて関数型言語の特徴を備えた比較的新しい言語です。この、 " オプジェクト指向に加えて " というのがポイントです。新しいパラダイム ( 問題解決のための考 え方 ) を、従来のパラダイムに重ね合わせていることから、マルチパラダイムの言語ともいわれま す。ちなみに Scala という名前は、 ScalabIe Language( 拡張性のある言語 ) の短縮形です。そのス ケーラブルという言葉には、「小さいプログラムも大規模なプログラムも同じ概念で記述できるべ きである」という、柔軟性や拡張性を重視した言語設計の意図が込められています。 Scala は、関 数型言語の機能を取り込むことで、簡潔で明瞭なコーディング、言語自体の拡張性、バグを作り込 みにくいプログラミングスタイル、並行処理向きなど、オプジェクト指向とは異なる特徴を持って います。簡潔な表現の一例として、同じ機能のクラスを Scala と Java で書いたコードをリスト 1 とリスト 2 に示します。 リスト 1 お金を表すクラスの Scala 版 / / ScaLa 版 package money import Java. util . Currency / / 佖 m 。はお金の量 , currency は通貨単位 class Money(va1 amount : BigDecima1 , val currency : Currency) リスト 2 お金を表すクラスの Java 版 package money; import java. util . Currency; public class Money { ななか十 inside press

10. ななか+Inside PRESS 2012 夏

3.2 クラスが簡潔に書ける ます。 リスト 13 補助コンストラクタの例 package money import java. uti1. Currency import Java. util . Loca1e class Money (val amount : BigDecima1 , val currency : 〃↓補助コンストラクタ this (amount , def this (amount : BigDecimal) Currency ・ getlnstance (Loca1e. getDefau1t) ) Currency) { 〃以下、省略 リスト 14 val a = new Money(100) / / プ 00 円 println(). amount) val b = new Money(50) / / 50 円 println(). amount) val result = a. plus(b) / / プ 00 円 println(result . amount) リスト 13 用のテストコード + 50 円 new Money()5 の ) / / プ 50 円かどうか検証 assert (result 3.2.5 オプジェクトでインスタンスを一つに限定 Java では、よく使う値を staticfinal なクラスフィールドで定義します。 Scala で書いた Money クラスでも、 Currency を円にするなど定数のようにできないものでしようか。 通常のクラスだけでは以下のようにインスタンス化しないで定数フィールドを参照することは できません。 val usdCurrency = Money. USD scala では static final の代わりにオプジェクトが使えます。 He110,World の節で紹介した HelloWorId がオプジェクトでした。このオプジェクトは一見すると、 object キーワードで宣言 するクラスのようなものですが、複数のインスタンスが作成できるクラスとは違い、一つのイ ンスタンスしか生成できません。デザインパターンのシングルトン ( クラスのインスタンスが一 つしか生成されない ) を言語としてサポートしているわけです。使用する場合の注意点は、オプ 合に暗黙的に指定する引数のことです。 class Money(var amount: BigDecimal,var currency: Currency Currency. getInstance(Locale. getDefault) ) . ななか十 inside press ◆ 16