Руст Васм Биндген возвращает объект, но получает номер

Сегодня, проводя тесты скорости ржавчины wasm против js с помощью wasm-bindgen, я столкнулся с проблемой.

Я сделал простую структуру, как вы можете видеть здесь:

Я использовал эту структуру в простой функции gimmeDirections, как показано здесь:

После компиляции в javascript браузера я заглянул в скомпилированный в него файл.d.ts и заметил, что функция gimmeDirections вернула число.

хотя в js он заявляет в JSDOC, что он вернул класс XY, который был определен ранее в скомпилированном коде.

вот класс:

       export class XY {

    static __wrap(ptr) {
        const obj = Object.create(XY.prototype);
        obj.ptr = ptr;

        return obj;
    }

    free() {
        const ptr = this.ptr;
        this.ptr = 0;

        wasm.__wbg_xy_free(ptr);
    }
    /**
    * @returns {number}
    */
    get x() {
        var ret = wasm.__wbg_get_xy_x(this.ptr);
        return ret;
    }
    /**
    * @param {number} arg0
    */
    set x(arg0) {
        wasm.__wbg_set_xy_x(this.ptr, arg0);
    }
    /**
    * @returns {number}
    */
    get y() {
        var ret = wasm.__wbg_get_xy_y(this.ptr);
        return ret;
    }
    /**
    * @param {number} arg0
    */
    set y(arg0) {
        wasm.__wbg_set_xy_y(this.ptr, arg0);
    }
}

после того, как я был очень смущен, из-за того, что машинописный текст сказал, что он вернет число, но js сказал, что он вернет класс, я решил запустить его... и получил число обратно.

Объект ниже - это моя функция javascript, выполняющая идентичный код для теста, как вы можете видеть, у меня есть объект, а не число.

Вот мой код JS:

       import * as funcs from './wasm/wildz.js';
// compiled wasm js file
function directionsJS(x, y) {
    let xX = x;
    let yY = y;
    if (Math.abs(xX) === Math.abs(yY)) {
        xX /= Math.SQRT2;
        yY /= Math.SQRT2;
    }
    return {
        x: x,
        y: yY
    };
}
(async() => {
    const game = await funcs.default();
    console.time('Rust Result'); console.log(game.gimmeDirections(10, 10)); 
    console.timeEnd('Rust Result'); console.time('JS Result'); 
    console.log(directionsJS(10, 10)); console.timeEnd('JS Result');
})();

Я до сих пор не понимаю, почему он возвращает число, когда явно возвращаю объект. Помощь очень нужна и ценится

1 ответ

Многое из этого и многое другое объясняется в разделе " Экспорт структуры в JS" руководства wasm-bindgen, но я подведу итоги.

Структуры Rust "возвращаются" путем динамического выделения для них места и возврата на него указателя. Что вы видите в отношении функции, возвращающей number, это "сырая" функция ffi, которая связывает среду выполнения JS и модуль wasm. Он просто возвращает значение указателя.

Созданный XYКласс Javascript является оболочкой вокруг этого значения указателя и предоставляет функции для взаимодействия с ним. Созданный gimmeDirections функция - это оболочка для вызова модуля wasm, который создает этот класс.

Другие вопросы по тегам