簡體   English   中英

如何使用隱式參數傳遞函數

[英]How to pass a function with implicit as parameter

我想將函數fun1作為參數傳遞給fun2 但是fun1需要一個隱含參數。 有可能在fun2定義隱含值嗎?

代碼是這樣的:

import org.json4s._
import org.json4s.jackson.JsonMethods._

  def fun1(json:JValue)(implicit formats: Formats) = {

        //do something
  }


  def fun2(f: (JValue) => RatEvent,line:String ) = {

        implicit val formats = DefaultFormats  //has been defined in import
        val json = parse(line)  //covert string to jvalue
        val result = f(json)
  }

在這里我將fun1傳遞給fun2 ,編譯器抱怨它無法找到fun1的隱含值。

  fun2(fun1,"asdfasdf")    //error here,   fun1 is lack of an implicit value

我想通過改變fun2的形狀來解決問題

def fun2(f: (JValue)(implicit Formats) => RatEvent,line:String ) //doesn't compile

但我不知道如何正確地寫它。

補充:

聲明一個隱式格式似乎是一個很好的解決方案。 但我必須在fun2中定義它。 我讓問題變得簡單。 真正的樂趣看起來像:

  def fun2(f: (JValue) => RatEvent,lines:RDD[String] )(implicit sc:SparkContext) = {

        for (
          line <- lines
        ){
        implicit val formats = DefaultFormats  //has been defined in import
        val json = parse(line)  //covert string to jvalue
        val result = f(json)
        ......
        }
  }

formats已到的內部被定義linesmap功能(I使用for代替)。

Scala函數值的apply方法只有一個參數列表,不帶任何隱式參數。 你無能為力。

您可以更改fun2的形狀以將額外參數作為普通參數:

class J; class F; class R

def fun1(j: J)(implicit f: F): R =
  new R
def fun2(fn: (J, F) => R) {
  fn(new J, new F)
}

fun2(fun1(_)(_))

但是哎呀; 呼叫站點不如你想要的fun2(fun1)好。

如果您在呼叫站點具有隱式F范圍,則可以按如下方式更改fun2的形狀:

class J; class F; class R

def fun1(j: J)(implicit f: F): R =
  new R

def fun2(fn: J => R)(implicit f: F) {
  fn(new J)
}

implicit val f = new F
fun2(fun1)

好的,干凈的通話網站!

這符合您的要求嗎? 在你的問題中,你只在fun2體內的隱式范圍內有一個Formats ,但是我不知道這是你問題的必要條件,還是你想要縮小代碼以適應問題的方式。

暫無
暫無

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

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