Scala制御構造と関数


0.ポイント
  • if式有値
  • ブロックにも値があり、その最後の式の値
  • です.
  • セミコロン(ほとんどの場合)は、必要な
  • ではありません.
  • voidタイプはUnit
  • 関数定義でreturn
  • を使用することを避ける
  • 関数定義式から漏れないように注意=
  • 異常な動作はJavaまたはC++とほぼ同じで、catch文で「モードマッチング」を使用するのとは異なります.
  • Scala検査異常なし
  • 1.条件式
    if (x > 0) 1 else -1
    val s = if(x > 0) 1 else -1 
        Java   C++:s = x > 0 ? 1 : -1

    if(x>0) 1 else -1のタイプはIntであり、2つの分岐のタイプはすべてIntであるためである.if(x>0) "positive" else -1のタイプは、2つのブランチタイプの共通スーパータイプである.この例では、1つのタイプがjavaである.lang.String、もう一つのタイプはIntで、それらの共通スーパータイプはAnyと呼ばれています.else部分欠落:if(x>0)1 Scalaでは、各式に何らかの値があるはずです.この問題の解決策はUnitクラスを導入し,()と書くことである.if(x>0)1はif(x>0)1 else()()()と同等であり、UnitをJavaまたはC++のvoidとする.
    3.ブロック式と代入
    {}ブロックには一連の式が含まれており、その結果も式です.ブロック内の最後の式の値がブロックの値です.
    val distance = {
    val dx = x-x0;
    val dy = y - y0;
    sqrt(dx * dx + dy * dy)
     }

    Scalaでは、割り当てアクション自体に値はありません.その値はUnitタイプで、割り当て文の終了ブロックなどです.
    { r = r * n; n -= 1 }

    その値はUnitタイプです.
    x = y =1 #     
    y = 1   (),  x=()
     Java C++ ,             ,              。

    5.サイクル
    while(n > 0){
        r = r * n
        n -= 1
    }
    for(i <- 1 to n)
        r = r * i
    
    val s = "Hello"
    var sum = 0
    for(i <- 0 until s.length) //i        s.length-1
        sum += s(i)
    
    var sum = 0
    for(ch <- "Hello") sum +=ch

    ループを途中で終了:1.Boolean型の制御変数2を使用する.ネストされた関数を使用する-関数からreturn 3.Breaksオブジェクトのbreakメソッドの使用
    6.高級forサイクルとfor導出式
    for(i <- 1 to 3;j<- -1 to 3) print ((10 * i + j) + " ") // 11 12 13 21 22 23 31 32 33
    for(i <- 1 to 3;j<- 1 to 3 if i != j){
    print ((10*i +j) + " ")
    }  //12 13 21 23 31 32 //if     
    for(i <- 1 to 3;from = 4 - i;j <- from to 3){
        print((10 * i + j) + " ")
    } // 13 22 23 31 32 33

    forループのループがyieldで開始されると、ループはセットを構築し、反復するたびにセットの値を生成します.
    for(i <- 1 to 10) yield i % 3
    //  Vector(1,2,0,1,2,0,1,2,0,1)
    
    forfor(c <- "Hello";i <- 0 to 1) yield (c+i).toChar
    // "HIeflmlmop"
    for(c <- 0 to 1;c <- "Hello") yield (c+i).toChar
    //Vector('H','e','l','l','o','I','f','m','m','p')

    7.関数
    関数の定義:関数名を指定するには、パラメータを入力し、値タイプを返します.関数ボディの戻りタイプは、関数が再帰的である場合に指定されます.Scalaコンパイラは=記号の右側の式のタイプから戻りタイプを推定することができる.
    def abs(x:Double) = if (x >= 0) x else -x
    
    def fac(n:Int) = {
    var r =1 
    for (i <- 1 to n) r = r * i
    r
    }
    
    //  
    def fac(n:Int):Int = if(n <= 0) 1 else n * fac(n-1)
    //        ,Scala       n*fac(n-1)    Int。

    8.デフォルトパラメータと名前付きパラメータ
    def decorate(str:String, left:String="[", right:String = "]") = left + str + right
    

    パラメータleftとrightにはデフォルト値[和]が付いています.
    decorate("Hello") => "[Hello]"
    decorate("Hello","<<<",">>>")=>"<<<Hello>>>"

    9.変長パラメータ
    def sum(args:Int*)={
        var result = 0
        for (arg <- args) result += arg
        result
    }
    val s = sum(1,4,9,16,25) //           Seq   ,   for          。
    val s = sum(1 to 5) //  
    val s = sum(1 to 5:_*)// 1 to 5        

    再帰定義:
    def recursiveSum(args:Int*):Int = {
        if (args.length == 0) 0
        else args.head+recursiveSum(args.tail:_*)
    }
       head       ,tail            ,    Seq, _*         。

    10.プロセス
    関数体が{}に含まれているが、前の=番号がない場合、戻りタイプはUnitです.このような関数をプロセス(procedure)と呼ぶ.
    def box(s:String){//    
    var border = "-" * s.length + "--
    "
    println(border + "|" + s + "|
    "
    + border) }

    Unit戻りタイプを明示的に定義することもできます.
    def box (s:String):Unit = {
    ...
    }

    11.怠け者
    最初に値を取得したときに初期化されます
    lazy val words = scala.io.Source.fromFile(“/usr/share/dict/words”).mkString
    12.異常
    throw new IllegalArgumentException(「x should not be negative」)throw式には特別なタイプのNothingがあります.これはif/elseで役に立ちます.ブランチのタイプがNothingの場合、if/else式のタイプは別のブランチのタイプです.次のようになります.
    if( x >= 0){
        sqrt(x)
    }else throw new IllegalArgumentException("x should not be negative")
    //         Double,         Nothing,  ,if/else       Double。

    例外を取得する構文は、パターンマッチングの構文を使用します.
    try{
        process(new URL("http://horstmann.com/fred-tiny.gif"))
    }catch{
        case _: MalformedURLException => println("Bad URL:" + url)
        case ex:IOException => ex.printStackTrace()
    }

    より一般的な異常は、より具体的な異常の後にあるべきである.try/catch文は異常を処理し、try/finally文は異常が処理されていない場合に何らかの動作を実行します.