1

LuaJ を Scala で使用しようとしています。ほとんどのことは機能します (正しく行えば、実際にはすべて機能します!) が、Scala のセッター実装のおかげで、オブジェクトの値を設定するという単純なタスクが信じられないほど複雑になっています。

スカラ:

class TestObject {
  var x: Int = 0
}

ルア:

function myTestFunction(testObject) 
  testObject.x = 3
end

この Lua 関数を含むスクリプトまたは行を実行し、TestObject の強制インスタンスを myTestFunction に渡すと、LuaJ でエラーが発生します。LuaJ は値を直接記述しようとしており、Scala では暗黙的に定義されたセッターを経由する必要があります (恐ろしい名前 x_= を使用します。これは有効な Lua ではないため、関数として呼び出しようとしても Lua は解析されません)。 .

前述したように、独自のセッターを定義するか、@BeanProperty マークアップを使用するなど、これに対する回避策があります。簡単に書けるはずのコードをもっと複雑にしてしまうだけです。

ルア:

function myTestFunction(testObject) 
  testObject.setX(testObject, 3)
end

そのような割り当てのセッターを暗黙的に呼び出すように luaj を取得する方法を知っている人はいますか? または、おそらくそのようなことを実装するために、luaj ソース コードのどこを調べることができますか?

ありがとう!

4

2 に答える 2

1

私はLuaJにあまり詳しくないことを認めなければなりませんが、あなたの問題に関して最初に頭に浮かぶのは、オブジェクトをプロキシテーブル内にラップしてAPIとのやり取りを容易にすることです. ニーズの種類に応じて、このソリューションが最適である場合とそうでない場合がありますが、一時的な修正には適している可能性があります。

local mt = {}

function mt:__index(k)
    return self.o[k] -- Define how your getters work here.
end

function mt:__newindex(k, v)
    return self.o[k .. '_='](v) -- "object.k_=(v)"
end

local function proxy(o)
    return setmetatable({o = o}, mt)
end

-- ...

function myTestFunction(testObject) 
    testObject = proxy(testObject)
    testObject.x = 3
end

これが、問題を解決するための最も侵襲性の低い方法である可能性があると思います。ニーズに合わせて LuaJ のソース コードを変更する方法については、ドキュメンテーションとソース コードをざっと見て、これこれ、およびこれを見つけました。私の推測では、JavaInstance.java の 71 行目は、Scala が別の方法で値を設定する必要がある場合に、変更が必要なものを見つける場所であると言えます。

    f.set(m_instance, CoerceLuaToJava.coerce(value, f.getType()));
于 2013-11-19T23:09:17.030 に答える
0

おそらく、メソッド構文を使用する必要があります。

testObject:setX(3)

ドット「.」の代わりにコロン「:」に注意してください。一部のエディターでは区別が難しい場合があります。

これは、関数呼び出しと同じ効果があります。

testObject.setX(testObject, 3)

しかし、より読みやすいです。

クラスの静的メソッドを呼び出すためにも使用できます。

luajava.bindClass("java.net.InetAddress"):getLocalHost():getHostName()

「:」の左側の部分は 1 回評価されるため、次のようなステートメントは

x = abc[d+e+f]:foo()

であるかのように評価されます。

local tmp = abc[d+e+f]
x = tmp.foo(tmp)
于 2014-01-14T15:26:59.327 に答える