如何在scalajs中获取参数对象

时间:2017-04-06 15:15:07

标签: scala.js

在JS中,我可以通过arguments对象访问函数参数。

我想在ScalaJS中以某种方式做同样的事情,因为我想对函数及其得到的参数进行一些记录。

有可能吗?

3 个答案:

答案 0 :(得分:1)

正如@ justin-du-coeur建议的那样,您可以使用sourcecode。例如:

object Test extends js.JSApp {
  def main(): Unit = {
    a(1, "a")
    b()
    c("foo", "bar", "baz")
  }

  def trace()(implicit name: sourcecode.Name, args: sourcecode.Args): Unit = {
    def makeArgList(as: Seq[sourcecode.Text[_]]): String =
      as.map(a => f"${a.source} = ${a.value}").mkString("(", ", ", ")")

    val argStr = args.value.map(makeArgList).mkString("")
    println(f"${name.value}$argStr")
  }

  def a(arg1: Int, arg2: String): Unit = {
    trace()
  }

  def b(): Unit = {
    trace()
  }

  def c(x: String*): Unit = {
    trace()
  }
}

输出如下:

[info] Running Test
a(arg1 = 1, arg2 = a)
b()
c(x = WrappedArray(foo, bar, baz))

正如您所看到的,trace可以从上下文中捕获所需的一切,因此结果比我能想到的任何JS解决方案都更加免费。

答案 1 :(得分:0)

嗯 - 有趣的问题。老实说,我不知道是否有办法访问arguments本身。我可能会通过使用专为此类事情设计的sourcecode library来解决记录函数参数的需求,但我承认我还没有尝试过Scala.js ...

答案 2 :(得分:0)

您无法直接访问Scala.js中的arguments对象。但是,您可以使用varargs导出方法,它将在JavaScript中按预期工作:

object Logger {
  @JSExportTopLevel("log")
  def log(xs: js.Any*): Unit = {
    xs.foreach(println)
  }
}

这将log定义并导出到顶级范围。在JavaScript代码中,您现在可以调用:

log(1, {}, {a: 1}, "foo");