2017-04-06 23 views
0

在JS中,我可以通過arguments對象訪問函數參數。如何在scalajs中獲取參數對象

我想在ScalaJS中以某種方式做同樣的事情,因爲我想做一些日誌記錄功能和他們得到的參數。

可能嗎?

+0

請用您正在嘗試做的事情的片段更新您的問題。目前形式的問題很難理解。 – gzm0

回答

0

嗯 - 有趣的問題。我真的不知道是否有辦法訪問arguments本身。我可能會通過使用sourcecode library來解決記錄函數參數的需求,這是爲那種事情設計的,但我承認我還沒有嘗試過從Scala.js那裏...

+0

難道不可能從基本scalajs以某種方式發出純粹的js嗎?我寧願不引入額外的庫。 – romeozor

+0

源代碼將完全在Scala.js上工作(並且只發出「純」JS)。 – gzm0

+0

是的,它真的聽起來像源代碼可能是最好的方式來做什麼在這裏尋找...... –

0

你無法直接訪問Scala.js中的arguments對象。但是,您可以導出可變參數的方法,並預期在JavaScript它會工作:

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

這定義和出口log到頂級的範圍。在JavaScript代碼,您現在就可以撥打:

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

謝謝,這意味着我需要每次傳遞每一個參數。這比傳遞參數對象方便得多。 – romeozor

+0

@romeozor我不明白你的意思。在上面的代碼片段中,'xs'基本上和'arguments'對象是一樣的。你可以繞過那個。 – sjrd

+0

@ gzm0在我的Scala代碼中,我想放入一些日誌記錄調用,這也是Scala代碼,然後將其編譯爲JS。 JS中的'arguments'使我可以訪問所有的函數參數。問題不在於日誌記錄,而在於傳遞參數。我可以有一個函數1,參數,另一個3,我需要用這些相同的參數調用'log()'。但是,如果我可以訪問'arguments',那麼我可以通過'log(arguments)'。 – romeozor

1

正如@賈斯汀篤心建議,您可以使用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解決方案我能想到。