【问题标题】:Scala: Calling function dynamicallyScala:动态调用函数
【发布时间】:2018-02-02 22:21:18
【问题描述】:

我对 scala 很陌生。

我正在使用 rscala 与 R 函数集成。 例如,我正在使用以下方法调用 R 函数并检索字符串值。

方法签名:

def invokeS0(function: Reference, args: Any*): String

方法实现

val v= rc.invokeS0("doPred","lemmas"->"Communicate,Design,Java,","frequency"->"3,3,1")

我的问题

但是,rc.invokeS0 可以调用任何函数,因此具有任意数量的参数。

我正在考虑构建一个包装器方法,该方法将函数名作为字符串,将参数作为映射。也许是这样的:

private def invokeRStringFunction(functionName: String = "testFunction", args: Map[String,String]): Unit =
{
    /**Iterate through map to generate following code*/
    val v= rc.invokeS0(functionName,mapKey1->mapValue1,mapKey2->mapValue2 etc etc)
}

但鉴于参数的数量是动态的,我不确定如何编写代码。坦率地说,我不确定这是否可能,但我想我会检查一下,以防万一。

任何提示将不胜感激。

【问题讨论】:

    标签: scala


    【解决方案1】:

    使用args.toSeqMap[String, String] 转换为Seq[(String, String)],然后使用_* ascription 将其作为参数序列而不是一个参数传递。

    def invokeRStringFunction(functionName: String, args: Map[String, String]): Unit
    = rc.invokeS0(functionName, args.toSeq: _*)
    

    【讨论】:

    • 谢谢!那将如何处理参数名称和参数值之间的'->'运算符?
    • 它不是运算符。 Scala 的运算符很少。 -> 只是一种方法,由 Any 上的隐式转换定义,它从两个值中创建一对。 a -> b(a, b) 的意思相同,但看起来更好。一个Map[A, B],当变成一个Seq,就变成了一堆键值对(A, B)
    • 我试试看!太感谢了。我一定会在工作时点赞并接受
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2015-04-04
    • 2012-07-17
    • 2011-10-26
    相关资源
    最近更新 更多