数学序列创建绑定循环

时间:2014-09-02 08:39:29

标签: javascript binding qml

我试图根据数学序列创建伪随机数。

我创建了两个种子,以及每次调用种子时更新种子的函数:

property var seed1: 12;
property var seed2: 23;

function pAlea(m) {
    var res = (seed1 + seed2) % m;
    seed1 = seed2;
    seed2 = res
    return res;
}

然后我尝试创建一个包含伪随机值的数组:

property var tab: {
    var tab = [];
    for (var i = 0; i <10; i++) {
        tab.push(pAlea(100));
    }
    return tab;
}

因为&#34; res&#34;根据两个种子计算,并将seed2更新为res,系统检测绑定循环。但它不应该:在这里,我不想绑定另一个我只想要它的值。

如何防止在seed2和res之间发生绑定?

和seed1和seed2之间的beet?

依旧......

1 个答案:

答案 0 :(得分:1)

您的代码运行正常。既然你没有绑定属性,只是简单地通过=运算符赋值,我想绑定循环正在其他地方发生。如果要绑定函数内的属性,则需要显式使用Qt.bind()。这段代码适合我:

import QtQuick 2.2

Rectangle {
    property var seed1: 12;
    property var seed2: 23;

    function pAlea(m) {
        var res = (seed1 + seed2) % m;
        seed1 = seed2;
        seed2 = res

        console.log("res: " + res);

        return res;
    }

    Timer {
        id: timer;
        interval: 1000; running: true; repeat: true
        onTriggered: pAlea(5);
    }

    Component.onCompleted: {
        timer.start();
    }
}

更新

好的,在您发表评论后,我可以看到您的问题是什么。事实上它非常有趣。我花了一些时间在这上面,并且无法找到绑定循环来自的答案。但有两种方法可以解决这个问题:

解决方案1 ​​

我个人只是将一个数组用于tab属性,并在发出组件的创建信号时对其进行初始化,如下所示:

import QtQuick 2.2

Rectangle {
    property var seed1: 12;
    property var seed2: 23;
    property var tab: [];

    function pAlea(m) {
        var res = (seed1 + seed2) % m;
        seed1 = seed2;
        seed2 = res

        console.log("res: " + res);

        return res;
    }

    Component.onCompleted: {
        for (var i = 0; i <10; i++) {
            tab.push(pAlea(100));
        }
        console.log("tab (after completion): " + tab);
    }
}

解决方案2

我发现当你将pAlea函数的逻辑移动到属性初始化时,绑定循环问题就消失了,如下所示:

import QtQuick 2.2

Rectangle {
    property var seed1: 12;
    property var seed2: 23;

    property var tab: {
        var result = [];

        var m = 100;
        for (var i = 0; i <10; i++) {
            var res = (seed1 + seed2) % m;
            seed1 = seed2;
            seed2 = res
            result.push(res);
        }

        return result;
    }

    Component.onCompleted: {
        console.log("finished: " + tab);
    }
}

像你一样初始化属性(至少据我所知)并不常见。基本上你将花括号内的表达式绑定到属性,并且因为Qt做了一些解释魔法,所以初始化如何影响属性行为或如何解析绑定并不总是很明显,例如:

import QtQuick 2.2

Rectangle {
    property var one: {
        "one"
    }
    property var two: {
        console.log("two");
    }
    property var three: {
        function() { console.log("three");}
    }
    property var four: {
        one+=" plus three";
    }
    property var fiveAndSix: {
        five : "five";
        six : "six";
    }
}

在根元素的onCompleted函数中将属性(与上面相同的顺序)打印到调试控制台会显示一些意想不到的事情:

qml: two
qml: one: one plus three
qml: two: undefined
qml: three: function() { [code] }
qml: four: one plus three
qml: fiveAndSix: six

有些事情更明显,有些事情令人惊讶(但我应该走到尽头,尽管这很有趣......)。就个人而言,我会尽量避免这样(我会称之为)内联属性定义,而是处理初始化,如解决方案1中所示,或者使用C ++进行此类操作。

也许我能够帮助你至少一点点,即使为什么仍然不清楚。