簡體   English   中英

Scala-我可以定義一個函數來接收任何函數作為參數嗎?

[英]Scala - Can I define a function that receives any function as a parameter?

在Scala中,是否可以定義一個可以接收其他任何函數作為參數的函數?

它應該類似於以下內容:

object Module extends SecureModule{
    val bc = new MyBC()

    def method(parameter: Type) = {
        exec(bc.method(parameter))
    }
    def method2(parameter1: Type1, parameter2: Type2) = {
        exec(bc.method2(parameter1,parameter2))
    }
}

trait SecureModule {
    def exec(f: ANY_PARAMETER => ANY_RESULT) = {
        //some extra processing
        f
    }
}

可能嗎? 如果是這樣,我怎么能做到這一點?

先感謝您。

scala的好處是您可以創建自己的語法。

如果要包裝一個操作以便可以進行預處理和后期處理,以及控制執行上下文,則可以使用按名稱調用參數來執行此操作。 例如,如果我們只是想計時一個代碼塊要花多長時間,那么我們可以執行以下操作:

def timer[T](block: => T): (T,Long) = {
  val startDate = new Date()
  val result = block
  val endDate = new Date()
  (result, endDate.getTime()-startDate.getTime())
}

我們可以這樣使用它:

val (result,duration) = timer {
  1+3
}

或者像這樣

val (result,duration) = timer {
  "hello" + " world!"
}

結果將具有您傳入的塊中正確的類型,同時還為您提供了所需的持續時間。

我的印象是您的描述有些誤導。 據我了解,您(可能)想做的就是將bc.method調用的執行延遲到執行了其他一些代碼為止。 如果是這樣,請嘗試以下操作:

object Module extends SecureModule{
    val bc = new MyBC()

    def method(parameter: Type) = {
        exec(() => bc.method(parameter))
    }
    def method2(parameter1: Type1, parameter2: Type2) = {
        exec(() => bc.method2(parameter1,parameter2))
    }
}

trait SecureModule {
    def exec[Result](f: () => Result): Result = {
        //some extra processing
        f()
    }
}

您不能將任何函數用作參數。 你會怎么做?

充其量,您可以使用具有特定數量參數的任何函數。

例如,在這里, f接受一個參數並返回一個值。

def exec[A,B](f: A => B)

在這里, f有兩個參數:

def exec[A,B,C](f: (A, B) => C)

如果您不關心函數的返回類型,則可以始終使用Any代替類型參數,因為函數的返回類型是協變的:

def exec[A](f: A => Any)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM