Statistical Programming

JavaとScalaの違いその2 ... Importがちょいと便利に

前回に引き続きJava→Scalaの学習を進めたいと思います。

今回は関数の違いとimportのやり方をちょろっと。

メモなのでかなり雑です。はい。

 

package test

import java.io._;

object Test2 extends App {

//可変長引数を取る関数

    def printStrings(strings:String*):Unit={

 for (string<-strings){

   println(string)

  

 }

    }

    //可変長引数は*を使って表現。

    printStrings("aaa","bbb","ccc")

    //Listを使った引数の渡し方

    var lis=List("l","i","s")

    //var lis=("a","b","c") とすると、Arrayになるため以下のようにリストで渡そうとしてもエラーとなる

    printStrings(lis: _*)

    

    def getStrings(string:String*)={

    string

    }

    //returnは通常書かない。最後の文の値が自動的に返される。

    println(getStrings(lis:_*))

    //引数のデフォルト値を設定することが可能

    def setDefault(name:String, dodo:String="Hello"):Unit={

      println(dodo+name+"!")

    }

    setDefault("coin","get")

    //引数は左から順に入れられるためデフォルト値を設定する引数は右から順に並べる

    setDefault("scala")

    //特殊なメソッド名apply

    var list1=Array.apply(1,2,3)

    //var list1=Array(1,2,3) と同じ意味。

    //コレクションの初期化生成などの際に役立っている。

    setDefault(dodo="get", name="coin")

    //Javaでは引数の順序を間違えるとエラー(それ自体はScalaも同じ)だが、

    //引数を指定することで順序を変更して引数に値を代入することが可能

 

}

 

 

これを実行すると

 

aaa

bbb

ccc

l

i

s

List(l, i, s)

getcoin!

Helloscala!

getcoin!

 

 

このようにコンソールに表示されます。

次にimportのやり方。ほとんどjavaと変わらないのですが、

ワイルドカードが*ではなく_で表現します。

それと、長ったらしいクラス名にあだ名をつけてあだ名でそいつらを呼んだりもできます。

下の例ではScannerクラスをscnと勝手に名付けています。

 

package test

import java.util.{Scanner=>scn}

import java.io._;

 

object ImportTest extends App {

   def scan()={

      var sc=new scn(System.in)

      var getstring=sc.next()

      println(getstring)

    }

   scan()

}