【问题标题】:Scala implicit classes as function argumentsScala 隐式类作为函数参数
【发布时间】:2019-08-13 15:55:32
【问题描述】:

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

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)

提前致谢。

【问题讨论】:

  • 你可以创建implicit class,而不是像这样class + implicit def

标签: scala apache-spark implicit


【解决方案1】:
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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    相关资源
    最近更新 更多