2008-05-01から1ヶ月間の記事一覧
関数のパラメータに「implicit」をつけておくと、関数の呼び出し時にその引数を省略できるようになります。省略された引数には、メソッドの呼び出し元コンテキストで一番それっぽいimplicit付きの値をコンパイラが選択して挿入してくれます。 「implicit」は…
インスタンスイ二シャライザを使って初期化したMapをRMIで送付しようとしたらエラーになった。問題のMapの初期化コードは以下。 RMIObject rmiobject = new RMIObject(); rmiobject.setMap(new HashMap<String, String>(){{ put( "a", "aaa" ); put( "b", "bbb" ); put( "c",</string,>…
「val」で不変の値を定義する際に、「lazy」修飾子をつけると、値が遅延評価される(最初にアクセスされたときにのみ評価され、定義時には評価されない)ようになります。 「lazy」は「val」にのみ設定できます。「var」や「def」に設定することはできません。…
要素を必要になったときに作成して返す仕組みとしてはStreamのほかにIteratorもあります。hasNext(),next()を持つアレです。Java使いにはこっちの方がわかりやすいかも。以下はフィボナッチ数を順に返すイテレータのサンプルです。 Iteratorを継承した無名ク…
テストを実行するターゲットを書きました。テストのコンパイル→実行→レポート作成を行ないます。 <path id="class.compile.path"> </path> <path id="test.compile.path"> <path location="lib/junit.jar"/> <path refid="class.compile.path" /> </path> </path></path>
Streamは要素が必要になったときに作成されるList(みたいなモノ)です。 要素は必要になったときに初めて作成されるので、 要素の作成に時間がかかる場合に初期作成コストを抑えることができます。 また、要素を全部辿らない場合に無駄な作成コストを削減でき…
昨日書いたオブジェクトのメソッド呼び出しを「 」で実行できる件について、みずしまさんよりコメントを頂いた(ありがとうございます!)ので、仕様書を確認。 どうも、メソッド呼び出しと演算子がまったく別物という認識がそもそも間違っていたようだ。Scala…
処理をn回繰り返したいときは「until」が使えます。 // 処理を10回繰り返したい for ( i <- 0 until 10 ) println( i ) 実行結果です。 0 1 2 3 4 5 6 7 8 9「0 until 10」を最初見たとき「なんだこれ?」と思ったんですが(そういう演算子があるのかなーとか…
GitHubがよいらしいという話を聞くので使ってみようと思ってアカウントを作ったのだけど、リポジトリにhttpでアクセスする方法がわかりません・・・。git自体はhttpでのリポジトリの公開をサポートしているようなので、できるモノだと思っていたんだけど。ん…
for文を使うと、配列やListの操作を簡単に行なうことができます。 配列を列挙する 単純に配列を列挙するには次のように書きます。 for ( <パターン名> <- <配列> ) <処理> これで以下の処理が行なわれます。 配列の値を一つ取り出してパターン名が示す変数に…
隣の炎上プロジェクトのヤパイコード探しを仰せつかったので、とりあえずFindBugsにかけてみると、↓こんなのが出た。 class Hoge { private String foo; public void setFoo( String foo ) { synchronized( this.foo ) { // fooへの更新を1スレッドに制限し…
class TestException<T> extends Exception {} ↑みたいな例外を作成しようとしてエラーに。「The Java Language Specification」を読むと8.1.2 Generic Classes and Type Parametersに記載があった。 It is a compile-time error if a generic class is a direc</t>…
またいつかはまりそうなのでメモ。 現象 サーバーを再構築したら、DB2のROW_NUMBER関数の実行でエラー(SQLSTATE: 42884)が発生するようになった。 同じバージョンのDB2を利用している他のサーバーでは正しく動作している。 同じモジュールを使用している他の…
となりのチームのプロジェクトが炎上気味でついに出稼ぎに出る羽目になったわけですが、そのプロジェクトではGuiceもSpringもSeasarも使ってないので、アスペクトがさくっと使えない。リリースも近いし、今からモジュール追加するのもメンドウだなー、セット…
可変長の配列(javaのList)を使いたい場合、scala.Listが使えます。 同じような機能を持つクラスとして、scala.Arrayがありますが、 scala.Arrayは固定長で、Javaにおける配列(new int[]とか)に近い。 scala.Listは可変長で、JavaにおけるListに近い。 可変長…
複数の値を返したいけどコンテナとするクラスを定義するのがメンドイ、というときにタプルが使えます。 タプルは複数の値を保持する組み込みのクラス(scala.Tuple2 .. etc)です。 要素数に応じてそれぞれ別のクラスが用意されているので、必要な要素数にあわ…
FileChannel#lock()を実行し、ロックの取得を待っているスレッドに割り込むと、「FileLockInterruptionExceptionが発生する」とか書いてある(ように読める)んだけど、何も起きない・・・。 // ロックするファイル final File file = new File( "./test.tmp" …
型パラメータに「+」「-」をつけることで、パラメータ化されたクラスの代入制限を少し緩くできます。 パラメータ化されたクラスの代入制限とは? 次のような、型パラメータを受け取るクラスがあるとして、 // 型パラメータを受け取るクラス class Holder[A](v…
配列(scala.Array)の基本的な使い方についてまとめ。 生成 「new Array[]()」で生成。 // 生成 var array = new Array[Int](5) n番目の要素の設定 「配列() = 」を使う。「[]」じゃないよ! // n番目の要素を設定 array(2) = 20 // 2番目の要素を20に。 array…
文字列をバイト配列に変換するString#getBytes()ですが、環境によってエンコードで使われるデフォルトの文字セットが違うため、注意が必要です。「デフォルトはUTF-8」とか思い込んでいて、だいぶさまよってしまいました・・・。String#getBytes()の実装をみ…
って、できるんですね。Listとかのコレクションに突っ込んで一気にシリアライズしないといけない!とか勝手に思い込んでいました。 import java.io._ // シリアライズ対象 class Kitten( name:String, age:int ) extends Serializable { override def toStrin…
Rubyで使えるハッシュ関数の性能を測ってみた。 Rubyのメッセージダイジェストライブラリで使えるハッシュ関数+String#hashの処理時間を計測 各処理を10000回実行して合計処理時間を出す。 結果は以下。 ハッシュ関数 所要時間(秒) sha1 0.913 sha256 1.572 …
Classの継承やメンバーのオーバーライドを制限する機能として「final」と「sealed」が使えます。 「final」はクラスやメンバーに対して設定できる修飾詞です。 finalが設定されたクラスは継承できません。 finalが設定されたメンバーはオーバーライドできま…
Scalaの型パラメータでは、パラメータで受け付けるクラスの範囲を制限することができます。Javaの「super」とか「extends」みたいな機能です。 「[ ]」とすることで、「は派生の何か」に制限できます。 「[ >: ]」とすることで、「はまたはその上位クラスの…
ScalaのObjectについて。The Scala LanguageSpecificationを読んでポイントをまとめます。 使いみち 定数(static変数)やstaticメソッドを作るのに使う。逆にscalaにはstaticがない。 内部的にはどうなってるの? 次のようなobjectの定義は、 object X extends…
ScalaByExample - Example 6 Classes and Objectsより。ScalaのClassとかTraitの違いについて、わかる範囲でまとめてみます。 ScalaのClassとかTraitの比較表 Class Abstract Class Trait Object 抽象メソッドを持てるか? × ○ ○ × メソッドの実装を書けるか?…
ScalaByExample - Chapter 5.2 Curryingより。関数を戻り値として返す関数を作ってみます。 引数で渡す場合と同様に、戻り値型を「: => 」とすることで関数を返すことを示します。 後は戻り値として関数を返せばOK // 関数を返す関数の定義 // 戻り値型を「<…
ScalaByExample - Chapter 5 First-Class FunctionsとScalaByExample - Chapter 5.1 Anonymous Functionsのポイントまとめ。 関数は値 Scalaの関数は値です。引数として渡したり、戻り値として返すことができます。以下は、関数を引数として受け取る関数の例…
ScalaByExample - Example 4.6 Tail Recursionより。Scalaでは末尾再帰は最適化されます。無駄なスタックを生成しないために、再帰を利用する関数は末尾再帰となるように設計しましょう、とのこと。 末尾再帰とは 再帰呼び出しを含む手続きが、自分自身の呼…
ScalaByExample - Example 4.3 Conditional ExpressionsからScalaByExample - Example 4.5 Nested Functionsあたりのポイントまとめ。 if-else は値を返す Scalaのif-else制御構文は値を返します。なので三項演算子的に使うことができるとのこと。 // if は…