2

スクリプト可能なオブジェクト ラッパーからネイティブの DateTime を返すことができましたが、スコープとコンテキストへの参照を持つラッパーが必要です。おそらくこれらの参照を渡す必要がない、これを行うためのより良い方法はありますか? (これは JodaTime ライブラリと Sugar JS を使用して Scala に実装されています)

テスト評価

import org.joda.time.DateTime
import org.mozilla.javascript._

object RhinoTest {

  val sugarScript = {
    val c= Context.enter
    val scope = c.initStandardObjects()
    c.compileString(FileUtil.readAllText("sugar-1.3.7.min.js"), "sugar", 1, null)
  }

  def main(args:Array[String]): Unit = {
    val cx = Context.enter
    val scope = cx.initStandardObjects()
    sugarScript.exec(c1, scope)

    val testDate = new DateTime(2010,10,10, 0, 0)
    val wrapper = Wrapper(Map("date" -> testDate),cx, scope)
    ScriptableObject.putProperty(scope, "map", wrapper)
    println(c1.evaluateString(scope,"Date.create('Tuesday').isBefore(map.date)", "Source", 1, null))
  }
}

そしてラッパークラス

case class Wrapper(map:Map[String,Any], cx:Context, scope:Scriptable) extends ScriptableObject {

  def getClassName() = "Wrapper"

  override def get(name:String, start:Scriptable):Object =
    (map.getOrElse(name, null) match {
      case d:DateTime => {
        val a = List[AnyRef](d.getMillis.asInstanceOf[java.lang.Long]).toArray
        cx.newObject(scope, "Date", a)
      }
      case a => a
    }).asInstanceOf[AnyRef]
}
4

1 に答える 1

0

原子的に変換Dateする方法はありませんNativeDate。変換は自分で行う必要があります。

ここで同様の質問への回答を参照してください

Rhino はデフォルトでは、Java Number および String オブジェクトを対応するプリミティブ型に変換しません。代わりに、LiveConnect を介して他の JavaObject をスクリプトに公開するのと同じ方法で、それらを特別なスクリプト オブジェクトにラップし、プリミティブな Java 値を対応するスクリプト値に変換するだけです。これをオーバーライドするには、カスタムの WrapHandler (次期 Rhino 1.5R4 では WrapFactory) を提供する必要があります。

JavaScript の java.util.Date および Date オブジェクトは、API だけでなく、内部表示も十分に異なります。特に、Script の Date は NaN 値を保持できますが、java.util.Date は保持できません。これらの理由から、変換方法の決定はアプリケーションに任せるのが最善です。

考慮すべきことの 1 つは、スクリプトを実行する前に変換を実行し、ラッパーを回避することです。

Object nativeDate = cx.newObject(scope, "Date", new Object[] {new Date().getTime()})
ScriptableObject.putProperty(scope, "date", nativeDate)
于 2016-08-26T22:58:41.063 に答える