1. 程式人生 > 其它 >Scala基礎04-方法與函式

Scala基礎04-方法與函式

技術標籤:Scalascala

一、傳名呼叫

object
Call_by_name { var m =10 def count:Int={ m+=1 m } def printByName(x: =>Int):Unit={ for (elem <- 1 to 3) { println(x) } } def printByValue(x:Int):Unit={ for (elem <- 1 to 3) { println(x) } } def main(args: Array[String]): Unit = { printByValue(
count)`在這裡插入程式碼片` printByName(count) } }

在這裡插入圖片描述

二、指定引數名

object Appoint{
  def appoint(a:Int,b:Int)={
    a*a+ b/b
  }

  def main(args: Array[String]): Unit = {
    println(appoint(2, 3))
    println(appoint(3, 2))
    println(appoint(a=3, b=2))
    println(appoint(b=2, a=3))
  }
}

在這裡插入圖片描述

三、動態引數

object strings{
def main(args: Array[String]): Unit = { strings("a","b","d") } def strings(ss:String*):Unit={ for (elem <- ss) { println(elem) } } }

在這裡插入圖片描述

四、遞迴函式

object res{
  def main(args: Array[String]): Unit = {
    println(factorial(10))
  }
  def factorial(n:Int):Int={
    if (n<=1){
      1
    }else{
      n*factorial(n-1)
    }
  }
}

在這裡插入圖片描述

五、內嵌函式

object triangle {
  def triangle(rows: Int): Unit = {
    def space(row: Int): Unit = {
      for (elem <- 1 to rows - row) {
        print(" ")
      }
    }

    def star(row: Int): Unit = {
      for (elem <- 1 to 2 * row - 1) {
        print("*")
      }
      println()
    }

    for (elem <- 1 to rows) {
      space(elem)
      star(elem)
    }


  }

  def main(args: Array[String]): Unit = {
    triangle(8)
  }
}

在這裡插入圖片描述

六、高階函式(函式呼叫函式)

object higherFunc{
  def main(args: Array[String]): Unit = {
    println(a(l, 20))//傳入函式l作為a的引數1,20作為a的引數2
  }
  //a() 函式使用了另外一個函式 f 和 值 v 作為引數,而函式 f 又呼叫了引數 v
  def a(f:Int=>String,v:Int)={
    f(v)
  }
  def l[T](x:T):String={
    "--"+x.toString+"--"
  }
}

在這裡插入圖片描述

object higherFunc2{
  def test(x:Int) = println(x)//基礎函式:傳值(或傳函式的呼叫結果),返回值
  def add(x:Int*)=x.reduce(_+_)
  def test2(x:(Int,Int)=>Int,y:Int*)={
    var sum = 0
    for (elem <- y) {
      sum = x(sum,elem)
    }
    sum
  }

  def main(args: Array[String]): Unit = {
    test(add(1,2,3,4))
  }
  println(test2(_-_,1,2,3,4))
}

在這裡插入圖片描述

七、匿名函式

object anonymous1 {
  def main(args: Array[String]): Unit = {
    var inc = (x: Int) => x + 1
    var a = inc(7)*2
    println(a)
    println(add(7) * 2)
  }

  def add(x:Int)={
    x+1
  }
}

在這裡插入圖片描述

八、庫裡化

  • 案例1:
object curry{
  def main(args: Array[String]): Unit = {
    println(add1(2, 3))
    println(add2(2))
    println(add2(2)(3))
    println(add3(2)(3))
  }
  def add1(x:Int,y:Int):Int={
    x+y
  }
  def add2(x:Int):Int=>Int={
    y:Int=>x+y
  }
  def add3(x:Int)(y:Int):Int={
    x+y
  }
}

在這裡插入圖片描述

  • 案例2:
object curry2{
  //返回值一個函式“(Int,Int)=>Int”,呼叫時就會有兩個引數
  def func():(Int,Int)=>Int={
    (x:Int,y:Int)=>x+y
  }
  //func()是一個函式名稱,第二個()是引數
  //func()

  def func2(t:Char):(Int,Int)=>Int={
    (x:Int,y:Int)=> t match {
      case t if (t=='+')=>x+y
      case t if (t=='*')=>x*y
      case t if (t=='-')=>x-y
      case t if (t=='/')=>x/y
    }
  }

  def main(args: Array[String]): Unit = {
    println(func()(2, 3))
    println(func2('*')(2, 6))
    println(func2('/')(2, 6))
    println(func2('+')(2, 6))
    println(func2('-')(2, 6))
  }
}

在這裡插入圖片描述

九、隱式引數

object yinshicanshu{
  def printTriangle(rows:Int)(implicit  up:Boolean=true)={
    def printSpace(row:Int)={
      for (elem <- 1 to (if(up) rows-row else row-1)) {
        print(" ")
      }
    }
    def printStar(row:Int)={
    //      for (elem <- 1 to (if(up) 2*row-1 else 2*rows+1-2*row)) {
      for (elem <- 1 to (if(up) (row<<1)-1 else ((rows-row)<<1) -1)) {
        print("*")
      }
      println()
    }

    for (elem <- 1 to rows) {
      printSpace(elem)
      printStar(elem)
    }
  }

  def main(args: Array[String]): Unit = {
    implicit val up = false
    printTriangle(7)(false)
  }
}

在這裡插入圖片描述

十、隱式函式

object yinshiFunc{
  case class Student(name:String)

  object Student{
    //隱式函式,放在被轉化函式的伴生物件裡
    implicit def toPlayer(stu:Student)={
      new Player(stu.name)
    }
    implicit def toSinger(stu:Student)={
      new Singer(stu.name)
    }
    def show(implicit age:Int)=println(s"my name is $age")
  }
  class Player(name:String){
    def play()=println(s"this is $name,I can play football")
  }
  class Singer(name:String){
    def sing()=println(s"this is $name,I can sing a song")
  }

  def main(args: Array[String]): Unit = {
    val stu:Student = new Student("henry")
    stu.play()//student類裡沒有play方法,沒找到,就去找隱式函式的伴生物件,如果沒有
    stu.sing()//student類裡沒有sing方法,沒找到,就去找隱式函式的伴生物件,如果沒有

    implicit val age:Int=18
    import logic.yinshiFunc.Student._
    show
  }
}

在這裡插入圖片描述