【问题标题】:How to get arguments object in scalajs如何在scalajs中获取参数对象
【发布时间】:2017-04-10 00:42:07
【问题描述】:

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

我想在 ScalaJS 中以某种方式做同样的事情,因为我想为函数和它们得到的参数做一些日志记录。

有可能吗?

【问题讨论】:

  • 请用您正在尝试做的事情的 sn-p 更新您的问题。目前形式的问题很难理解。

标签: scala.js


【解决方案1】:

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

【讨论】:

  • 不可能从基础scalajs中以某种方式发出纯js吗?我宁愿不引入额外的库。
  • 源代码可以在 Scala.js 上完美运行(并且只发出“纯”JS)。
  • 是的,听起来源代码可能是在这里寻找的最好方法......
【解决方案2】:

您不能直接访问 Scala.js 中的 arguments 对象。但是,您可以使用可变参数导出方法,它会在 JavaScript 中按预期工作:

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

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

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

【讨论】:

  • 谢谢,这意味着我每次都需要传递每个参数。这比只传递参数对象方便得多。
  • @romeozor 我不明白你的意思。在上面的sn-p中,xs基本上和arguments对象是一回事。你可以把那个传过去。
  • @gzm0 在我的 Scala 代码中,我想放入一些日志调用,这也是 Scala 代码,然后将其编译为 JS。 JS 中的arguments 让我可以访问所有函数参数。问题不在于日志记录,而在于传递参数。我可以有一个带有 1 参数的函数,另一个带有 3 的函数,并且我需要使用这些相同的参数调用 log()。但是,如果我可以访问arguments,我就可以通过log(arguments)
  • @romeozor 我仍然不明白您实际上要做什么,上述答案并未涵盖。您能否使用显示您将在 JS 中做什么的 sn-p 来编辑您的问题?这将使我们对您的要求有一个明确的理解。
  • @sjrd 他想做的是跟踪所有的函数调用。基本上在每个函数中,他都想添加一个呼叫trace("functionName", arguments),这样你就会得到一个“呼叫日志”。我猜在 Scala 中,只有使用隐式或宏元编程才有可能。
【解决方案3】:

正如@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 解决方案都更加免费。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2019-02-14
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多