2017-08-05 5 views
1

ネオンの使い方を学んでいますが、私は事を理解していません。私はこのコードを実行しようとした場合:ネオンは使用できませんJsArray:この関数は3つのパラメータをとりますが、2つは提供されました

#[macro_use] 
extern crate neon; 
use neon::vm::{Call, JsResult}; 
use neon::mem::Handle; 
use neon::js::{JsInteger, JsNumber, JsString, JsObject, JsArray, JsValue, Object, Key}; 
use neon::js::error::{JsError, Kind}; 

fn test(call: Call) -> JsResult<JsArray> { 
    let scope = call.scope; 
    let js_arr: Handle<JsArray> = try!(try!(call.arguments.require(scope, 1)).check::<JsArray>()); 

    js_arr.set(0, JsNumber::new(scope, 1000)); 

    Ok(js_arr) 
} 

register_module!(m, { 
    m.export("test", test) 
}); 

を私はjs_arr.setを呼び出すときに、私はこのエラーを取得:This function takes 3 parameters but 2 were supplied.

それはJsArrayだので、私は理由を理解していません。 Racerでもsetメソッドには2つのパラメータが必要であることがわかります。何があっても、js_arr.setは、&mut bool,neon::macro_internal::runtime::raw::Localneon::macro_internal::runtime::raw::Localの順に3つのパラメータをとります。

何が起こっているかJsArrayの仕組みを理解できません。

unsafe fn set(self, out: &mut bool, obj: Local, val: Local) -> bool 

私はあなたが誤って(Handle::setを呼び出そうとしているがunsafeであり、3つの非selfの引数をとることを推測すると思います:

+0

私はあなたが[ネオンリポジトリに問題を開いた]ことを確認(https://でgithubの。 com/neon-bindings/neon/issues/218) - [JsArray'に関する既存の問題](https://github.com/neon-bindings/neon/issues/57)も読んだことがありますか? – Shepmaster

+0

@Shepmaster道を見つけました、もし私が失礼であれば、ごめんなさい、助けてくれてありがとう。 – pietrovismara

+0

心配ありません。新しい言語やライブラリを手に入れようと苦労して、どのようにイライラすることができるのか、私は完全に理解しています!良いニュースは、他の人々の束が同じ根底にある問題を抱えているように見えるということです。 – Shepmaster

答えて

1

paulsevere says on a GitHub issue for Neonneon::js::Objectをインポートします。

#[macro_use] 
extern crate neon; 

use neon::vm::{Call, JsResult}; 
use neon::js::{Object, JsArray, JsInteger, JsObject, JsNumber}; 

fn make_an_array(call: Call) -> JsResult<JsArray> { 
    let scope = call.scope; // the current scope for rooting handles 
    let array = JsArray::new(scope, 3); 
    array.set(0, JsInteger::new(scope, 9000))?; 
    array.set(1, JsObject::new(scope))?; 
    array.set(2, JsNumber::new(scope, 3.14159))?; 
    Ok(array) 
} 

register_module!(m, { 
    m.export("main", make_an_array) 
}); 

これは、ブランドの新しい配列を作成します。また、もset方法を提供ない輸入Keyを行います。あなたはそれをあなたの関数の最初の引数として配列を受け入れ、その後、変更したい場合は、これは動作します:

#[macro_use] 
extern crate neon; 

use neon::vm::{Call, JsResult}; 
use neon::js::{Object, JsArray, JsInteger, JsUndefined}; 
use neon::mem::Handle; 

fn hello(call: Call) -> JsResult<JsUndefined> { 
    let scope = call.scope; 
    let js_arr: Handle<JsArray> = call.arguments.require(scope, 0)?.check::<JsArray>()?; 

    js_arr.set(0, JsInteger::new(scope, 1000))?; 

    Ok(JsUndefined::new()) 
} 

register_module!(m, { 
    m.export("hello", hello) 
}); 
+0

@pietrovismara * **タイプ** 'JsObject'ではなく' JsObject' *を既にインポートしました。**特性** 'Object'です。違いがありますが、なぜそれがうまくいかないのか説明します。 – Shepmaster

+0

それは本当です(typo)が、あなたが私の質問を見ると、私も 'Object'をインポートしたことがわかります。おそらく、輸入の順番や違いがあると思いますか? – pietrovismara

+1

@pietrovismaraああ、それを考え出した。それは 'Key'についてのもので、問題を引き起こす' set'という別のメソッドが追加されています。 – Shepmaster

1

let js_arr: Handle<JsArray>はそれを明確にjs_arrHandle<JsArray>Handle<T>この方法を持っていることになり)JsArray::setではなく(これは安全であり、2つの非0の引数を取る)。

この場合、deref_mutが強制的に発生する必要があります。 (_mutのでJsArray::set&mut selfかかります。)

私は前に衝突を命名この種のに実行していないので、私はauto-derefは十分にスマートであるかどうかを特定することはできませんが、このような何かが動作可能性があります

(&mut js_arr).set(0, JsNumber::new(scope, 1000)); 

しようとするには、2つの他のものがあり、それに失敗:

  1. JsArray::set(&mut js_arr, 0, JsNumber::new(scope, 1000));

    (前者の例がC++スタイルのメソッドのオーバーロードに似ているために失敗した場合。これはFully Qualified Syntaxとして知られており、通常のオブジェクトが同じ名前のメソッドを提供する2つの特徴を実装したときに明確にするために使用される。直接)

  2. コールjs_arr.deref_mut()基礎となるJsArrayへの変更可能な参照を取得するために、その上setを呼び出します。

+0

*これがうまくいくかもしれない* - 推測の代わりに試してみてはいかがですか? – Shepmaster

+2

@Shepmaster NeonはRust Playgroundの一部ではありません。私は今自分のマシンでテスト環境をセットアップする方法を混乱させる時間がありません。 (Node.jsを 'npm install -g'を超えて使用したことは一度もありませんでした。もし' rust-cpython'の質問だったら、既存プロジェクトの1つに簡単にスラップして簡単なテストをすることができました。) – ssokolow

+1

あなたは、何かを設定する必要があります。動的にリンクされているため、Rustコードをコンパイルすると、後でリンクするのに失敗します。 – Shepmaster

関連する問題