在JS中,我可以通过arguments
对象访问函数参数。
我想在ScalaJS中以某种方式做同样的事情,因为我想对函数及其得到的参数进行一些记录。
有可能吗?
答案 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");