タグ

ブックマーク / unageanu.hatenablog.com (17)

  • クラスを動的に作る - うなの日記

    Class.newで名前の付いていないクラスを動的に作成できます。 # 無名のクラスを新規作成 kitten = Class.new # メソッド「meow!」を追加。(define_methodはprivateメソッドなので直接は呼び出せない。) kitten.send(:define_method, :meow) {|i| puts "meow!"*i } # インスタンス化してメソッドを呼び出してみる。 mii = kitten.new mii.meow 3 実行結果です。 meow!meow!meow!

    クラスを動的に作る - うなの日記
    hchbaw
    hchbaw 2008/08/23
  • 関数を連結する - うなの日記

    Function#chainで複数の関数を連結して、1つの関数にできます。 // 連結する関数の配列 var fs = Array( (i:Int)=>i+2, (i:Int)=>i*3, (i:Int)=>i-2) // 連結した関数を実行。 println( Function.chain(fs)(4) ) 実行結果です。 16

    関数を連結する - うなの日記
    hchbaw
    hchbaw 2008/08/19
  • データ構造を伝えるコード - うなの日記

    例えばネストされたリストを作成する場合、 List<List<String>> nested = new ArrayList<List<String>>(); List<String> list1 = new ArrayList<String>(); list1.add( "a" ); list1.add( "b" ); list1.add( "c" ); nested.add(list1); List<String> list2 = new ArrayList<String>(); list2.add( "d" ); list2.add( "e" ); nested.add(list2); List<String> list3 = new ArrayList<String>(); list3.add( "f" ); list3.add( "g" ); nested.add(list3);

    データ構造を伝えるコード - うなの日記
    hchbaw
    hchbaw 2008/08/19
  • 複数行文字列リテラル - うなの日記

    """<文字列>""" で改行を含む文字列リテラルとなります。 // 改行を含む文字列リテラル。 var strs = """aaa bbb ccc""" println(strs) 実行結果です。インデントもそのまま残ります。 aaa bbb cccインデントうぜー、とか思う人は、RichString#stripMarginを使って次のように書けるよ!とかThe Scala Language Specificationに書かれているけど var strs = """aaa |bbb |ccc""".stripMargin これも微妙だなー。「|」とかメンドイ感じ。個人的には↓の方がしっくりくる感じ。 var strs = """ aaa bbb ccc """.trim ただし、前後の空白文字列が削除されるので、それがまずい場合は使えません。むー。 リテラル中の「"」の扱い リテラル中で

    複数行文字列リテラル - うなの日記
    hchbaw
    hchbaw 2008/07/03
  • 型キャスト - うなの日記

    オブジェクトを指定の型にキャストするには、Any#asInstanceOfを使います。また、指定した型と互換性があるか評価するにはAny#isInstanceOfを使います。 どちらもAnyのメソッドです。 型パラメータとして、変換or評価したい型を渡します。 var i = 10 var str = "aaa" // オブジェクトが指定した型と互換性があるか評価する。 println( i.isInstanceOf[String] ) // false println( i.isInstanceOf[Int] ) // true println( i.isInstanceOf[Any] ) // true println( str.isInstanceOf[String] ) // true println( str.isInstanceOf[Int] ) // false printl

    型キャスト - うなの日記
    hchbaw
    hchbaw 2008/07/03
  • 派生クラスでtype aliasの指定を強制する - うなの日記

    abstractなclass or trait に、型指定のない名前だけのtype aliasを書くと、派生クラスでこのtype aliasの定義を強制することができます。 abstract class Foo( ) { // 派生クラスで明示する必要があるtype alias // このクラスの派生クラスでは、Xのtype aliasを明示しなければならない。 type X // X型はこのクラス内で使用可能。 var x:X def getX:X = x def setX(value:X):Unit = this.x=value } // Fooの派生クラスを作成。 var foo = new Foo() { // 派生クラスでX型を指定 // 指定しないとコンパイルエラーになる。 type X = String var x = "aaaa" } // メソッド呼び出し。XはStrin

    派生クラスでtype aliasの指定を強制する - うなの日記
    hchbaw
    hchbaw 2008/07/03
  • MailBox - うなの日記

    MailBoxは、複数スレッド間での同期制御とメッセージの送受信をさくっとできるようにするユーティリティクラスです。 要は、Javaにおけるjava.util.concurrent.BlockingQueueです。メッセージ送付側はブロックしないようなので、容量制限のないjava.util.concurrent.LinkedBlockingQueueがたぶん近い。 RubyだとQueueですな。 使い方は次のような感じ。 import scala.concurrent._ import scala.concurrent.ops._ object MailBoxSample { // メッセージとしてやりとりするクラス private case class Value(i:Int) private case class End def main(args: Array[String]) {

    MailBox - うなの日記
    hchbaw
    hchbaw 2008/06/20
  • スレッドの同時実行制御(synchronized) - うなの日記

    synchronizedで複数スレッドの同時実行制御ができます。 機能はJavaのsynchronizedと同じで、指定された処理が、1スレッドからのみ実行されるようになります。同時に複数スレッドから実行されることはありません。 Javaと違って、すべての参照型の基底クラスであるAnyRefのメソッドとして定義されています。 引数で同期化する処理を受け取ります。 また、受け取った処理の結果を値として返します。 import scala.concurrent._ import scala.concurrent.ops._ import java.lang.Thread._ object SynchronizeSample { def main(args: Array[String]) { // 同期化用オブジェクト val monitor = new Object // 並列実行する処理 /

    スレッドの同時実行制御(synchronized) - うなの日記
    hchbaw
    hchbaw 2008/06/18
  • Variance Annotations - うなの日記

    型パラメータに「+」「-」をつけることで、パラメータ化されたクラスの代入制限を少し緩くできます。 パラメータ化されたクラスの代入制限とは? 次のような、型パラメータを受け取るクラスがあるとして、 // 型パラメータを受け取るクラス class Holder[A](value:A) { private var v:A = value // getter def get:A = { v } // setter def set(value:A):unit = { v = value } } 「AnyRef」と、その派生クラスである「String」でそれぞれインスタンスを作成した場合、両者に代入互換性はありません。 // 「AnyRef」と、その派生クラスである「String」でそれぞれインスタンスを作成 var stringHolder = new Holder[String]( "foo" )

    Variance Annotations - うなの日記
  • lazyで値を遅延評価する - うなの日記

    「val」で不変の値を定義する際に、「lazy」修飾子をつけると、値が遅延評価される(最初にアクセスされたときにのみ評価され、定義時には評価されない)ようになります。 「lazy」は「val」にのみ設定できます。「var」や「def」に設定することはできません。 値の評価は「最初にアクセスされたときに1回のみ」行なわれます。 複数回呼び出した場合、2回目以降は値の評価は行なわれず、初回の評価結果が返されます。 ここが「def」と違うところですね。「def」でも値は遅延評価になりますが、値の評価は参照時に毎回行なわれます。 // lazyをつけると、値の評価が初回アクセス時にのみ行われるようになる。 lazy val a = { println("eval a"); "a" } // var や def には適用できない。 // 以下はコンパイルエラー // lazy var b = { "

    lazyで値を遅延評価する - うなの日記
    hchbaw
    hchbaw 2008/05/30
  • finalとsealed - うなの日記

    Classの継承やメンバーのオーバーライドを制限する機能として「final」と「sealed」が使えます。 「final」はクラスやメンバーに対して設定できる修飾詞です。 finalが設定されたクラスは継承できません。 finalが設定されたメンバーはオーバーライドできません。 「sealed」はクラスに設定できる修飾詞です。 sealedとされたクラスは、同一ファイル内のクラスからは継承できますが、別ファイル内で定義されたクラスでは継承できません。 ただし、sealedクラスを継承したクラスは、別ファイルのクラスからも継承できます。 // finalクラス // このクラスは継承できない。 final class Foo // これはエラー //class ExtendsFoo extends Foo class Var { // final メンバー // これらはオーバーライド不可

    finalとsealed - うなの日記
    hchbaw
    hchbaw 2008/05/13
  • 型パラメータ - うなの日記

    beginner's guideの「8 Genericity」より。Scalaでも型パラメータを使うことができます。 「class <クラス名>[<型パラメータ>] ...」といった感じで、「[]」を使って指定します。(Javaと違って「<,>」ではないです。) 使い方はJavaと同じ感じです。(beginner's guideの「8 Genericity」を読む限りは。) サンプル。 // 型パラメータを受け取るクラス class Holder[a](value:a) { private var v: a = value // getter def get:a = { v } // setter def set(value:a):unit = { v = value } } // クラスを使うサンプル object Sample { def main(args: Array[String

    型パラメータ - うなの日記
    hchbaw
    hchbaw 2008/05/13
  • Mixin - うなの日記

    beginner's guideの「7 Mixins」を読みました。Scalaでは、RubyのようなMixinが使えます。 イメージとしてはtraitと呼ばれるAbstractなClassを複数継承する感じ。 継承したクラスでは、traitで定義された実装を持つメソッドを使うことができる。 また、traitで定義された実装を持たないメソッドを実装する必要がある。 // Mixinするメソッドを定義したtrait trait Comparable { // 実装を持たないメソッド。 // 派生クラスはこれを実装する必要がある。 def compare(that:Any):int // 以下のメソッドは実装を持つ。 def >(that:Any):boolean = compare(that) > 0 // Anyは「すべての型」を示す def ===(that:Any):boolean =

    Mixin - うなの日記
    hchbaw
    hchbaw 2008/05/13
  • CaseClassとパターンマッチング - うなの日記

    beginner's guideの「6 Case classes and pattern matching」より。ScalaではCaseClassというのを使ってパターンマッチングができるらしい。 サンプルコードは以下。 Classにはcaseを付けて宣言します。 関数では「def <関数名>(<引数..>):<戻り値の型> = <分岐条件> match { ... }」として、 関数の文の中で「case <型> => <処理>」として、マッチングした場合の処理を書きます。 // Case Class abstract class Animal case class Kitten(name:String, age:int) extends Animal case class Tiger(name:String, age:int) extends Animal case class Lio

    CaseClassとパターンマッチング - うなの日記
    hchbaw
    hchbaw 2008/05/13
  • うちのチームのテスト事情 - うなの日記

    うちのチームのテスト事情について、反省を含めてまとめてみます。 その前に業務内容など いわゆるビジネスロジックを作ってます。↓の青いところです。 サーバーモジュールとそのクライアントモジュールを開発している。 サーバーモジュールはさらにDAO的なモノに依存している。 クライアントモジュールはライブラリのみ。UIは別のチームが開発。 テスト事情 やっていること 結合テスト クライアントのAPIを叩いて、クライアント-サーバー-DBの結合動作をテストする。 工数を割いて網羅的に実施。 ただし、クライアントから実行して試すのが難しい操作(処理の途中でDBが落ちた場合とか)はテストに含めていない。この辺は、モックを利用した単体テストで補完する必要があると思う。 単体テスト クラスごとの単体テスト。 独立性が高く結合度の低いクラスについては行なっている。DAOを使うクラス(ロジックとか)は、単体テス

    うちのチームのテスト事情 - うなの日記
    hchbaw
    hchbaw 2008/05/13
  • Hello Scala World! - うなの日記

    情報処理技術者試験も終わったしそろそろ新しい言語でも調べてみるかなー、ということでScalaです。 Scala Wikipedia - Scala 特徴などは、Wikipediaの説明がわかりやすいかと。 ダウンロード&インストール ダウンロードサイトからダウンロード。インストーラもあったけど、何となくアーカイブ版を取得して展開しパスを通しました。 export SCALA_HOME=xxxx/scala-2.7.0-final export PATH=$SCALA_HOME/bin:$PATH Hello Scala World! とりあえず、beginner's guideを読みながらHello Worldまでやってみます。 ソースを書く 以下のコードをbeginner's guideからコピペして、「HelloWorld.scala」の名前で保存。 object HelloWorld

    Hello Scala World! - うなの日記
    hchbaw
    hchbaw 2008/04/23
  • try catch - うなの日記

    チュートリアルに出てこなかったので、例外の投げ方と捕捉方法について調べてみました。 Erlangにもtry .. catchによる例外処理の仕組みがあります。 JavaScriptと同様にthrow()で任意のオブジェクトを例外?として発生させることができます。 発生した例外はcatchで捕捉でき、パターンマッチによって処理を切り分けることが可能です。 Javaのfinallyに相当する機能も提供されています。 try構文 以下の形式で書きます。 try <処理1>, <処理2> catch [<クラス>:]<パターン1> [when <ガード条件>] -> <例外発生時の処理>; [<クラス>:]<パターン2> [when <ガード条件>] -> <例外発生時の処理> after <必ず実行したい処理> end <処理1>,<処理2>の部分に例外を捕捉したい処理を書きます。 この処理で例

    try catch - うなの日記
  • 1