首页 > 解决方案 > Scala 隐式类作为函数参数

问题描述

我正在学习隐式类以及使用附加功能和定义来装饰类。

https://coderwall.com/p/k_1jzw/scala-s-pimp-my-library-pattern-example

我的问题是,如何将这些附加函数作为参数传递给另一个函数。

示例: 我像这样定义了类和隐式函数

class BlingString(string: String) {
    def bling = "*" + string + "*"
    def doubleBling = "**" + string + "**"
}

implicit def blingYoString(string: String) = new BlingString(string)

现在我可以在 String 对象上使用这些函数了。

"this is one".bling            // prints *this is one*
"this is two".doubleBling      // prints **this is two**

我想通过将这些隐式函数传递给它来创建一个通用函数,

def blingMyString(name: String, blingFunc: ???)) = name.blingFunc

这样我就可以像下面这样使用它,

blingMyString("this is one", bling)
blingMyString("this is two", doubleBling)

这是因为我在 Spark Dataframe 上有一个包含 20 多个附加函数的类。(数据清理、数据格式化和转换)。

根据不同的场景,我必须在数据帧上执行一个或多个函数。

val out1 = df.operation1().operation2().operation3()
val out2 = df.operation1().operation3()
val out3 = df.operation1().operation4().operation3()
def clean(dynamicFn: ???): DataFrame = df.operation1().dynamicFn().operation3()

val out1 = clean(operation2)
val out2 = clean()
val out3 = clean(operation4)

提前致谢。

标签: scalaapache-sparkimplicit

解决方案


class BlingString(s: String) { 
   def bling1 = "*" + s + "*"
   def bling2 = "**" + s + "**" 
}
implicit def string2bling(s: String) = new BlingString(s)

def bling(s: String, f: BlingString => String) = f(s)

bling("ciao", _.bling1)
bling("ciao", _.bling2)

推荐阅读