binghc 发表于 2012-9-17 23:25:33

eval 和 assign 内部是怎么处理的,有人知道么

我自己也写了个简单的哈希函数,但是和用eval、assgin比起来速度慢了N个等级。
可惜eval和assign本身也有缺陷,还要避免和源代码里自定义的变量重名,还有访问范围等等用的不太爽的地方

有人知道eval和assign内部是怎么处理数据的么?

pusofalse 发表于 2012-9-20 17:31:31

除了AU3的作者,我想没人能知道两个函数的实现细节。至于变量名称重复的问题,可以使用Random函数给你要定义的变量名加一个随机前缀。

sanhen 发表于 2012-9-20 17:58:33

懂VC的话,自己看下吧。
///////////////////////////////////////////////////////////////////////////////
// Eval()
///////////////////////////////////////////////////////////////////////////////

AUT_RESULT AutoIt_Script::F_Eval(VectorVariant &vParams, Variant &vResult)
{
        bool        bConst = false;

        if (g_oVarTable.isDeclared(vParams.szValue()))
        {
                Variant *pvTemp;
                g_oVarTable.GetRef(vParams.szValue(), &pvTemp, bConst);
                vResult = *pvTemp;
                return AUT_OK;
        }
        else
        {
                SetFuncErrorCode(1);                        // Silent error even though variable not valid
                vResult = "";
                return AUT_OK;
        }

} // Eval()


//////////////////////////////////////////////////////////////////////////
// F_Assign("variable", "data")
//
// Assign( "varname", "value" [,flag])
//
// binary flag: 0=any, 1=local, 2=global, 4=no create
//
// Assigns the variable in the first parameter to the data in the second parameter.
// This is a compliment to Eval()
//////////////////////////////////////////////////////////////////////////

AUT_RESULT AutoIt_Script::F_Assign(VectorVariant &vParams, Variant &vResult)
{
        Variant *pvTemp;
        int                nReqScope = VARTABLE_ANY;
        bool        bCreate = true;
        bool        bConst = false;

        if (vParams.size() == 3)
        {
                if (vParams.nValue() & 1)
                        nReqScope = VARTABLE_FORCELOCAL;
                if (vParams.nValue() & 2)
                        nReqScope = VARTABLE_FORCEGLOBAL;
                if (vParams.nValue() & 4)
                        bCreate = false;
        }

        // Get a reference to the variable in the requested scope, if it doesn't exist, then create it.
        g_oVarTable.GetRef(vParams.szValue(), &pvTemp, bConst, nReqScope);
        if (pvTemp == NULL)
        {
                if (bCreate)
                        g_oVarTable.Assign(vParams.szValue(), vParams, false, nReqScope);
                else
                        vResult = 0;                                                // Default is 1
        }
        else
                *pvTemp = vParams;

        return AUT_OK;

}        // F_Assign()

pcbar 发表于 2012-9-20 22:17:08

{:face (301):}回复 3# sanhen
页: [1]
查看完整版本: eval 和 assign 内部是怎么处理的,有人知道么