如何更改 lambda 表达式中的字符串变量?

Posted

技术标签:

【中文标题】如何更改 lambda 表达式中的字符串变量?【英文标题】:How to change a string variable inside a lambda expression? 【发布时间】:2020-11-12 05:07:57 【问题描述】:

我在 cocos2dx 中工作,我试图在 lambda 表达式中更改一个名为 selectedBlockTexture 的字符串变量的值,该表达式充当按钮按下的回调。不幸的是,我找不到解决这个问题的方法,它一直告诉我在特定的内存位置有未处理的异常。

变量 selectedBlockTexture 是在这个 for 循环之外声明的,并且循环会遍历字典以自动生成按钮,这些按钮可以让我更改 selectedBlockTexture 变量的值。

for (auto it : blockDict) 
    auto newBlockButton = Button::create("button-block-basic.png", "button-block-basic.png", button-block-basic.png");
    auto buttonImage = Sprite::create(it.first);

    newBlockButton->setPosition(Vec2(76 * blockDictIter, 64));
    buttonImage->setPosition(Vec2(76 * blockDictIter, 64));
    buttonImage->setGlobalZOrder(2);
    buttonImage->setScale(0.75);

    newBlockButton->addTouchEventListener([&](Ref* sender, Widget::TouchEventType type) 
        switch (type)
        
        case ui::Widget::TouchEventType::BEGAN:
            break;
        case ui::Widget::TouchEventType::ENDED:
            chosenBlockTexture = it.first
            break;
        default:
            break;
        
     );

    blockDictIter++;

    newBlockButton->setGlobalZOrder(1);
    this->addChild(newBlockButton);
    this->addChild(buttonImage);

This is the error I keep getting

【问题讨论】:

【参考方案1】:

如果变量 selectedBlockTexture 是方法变量,编译器将找不到错误:

std::string chosenBlockTexture = "123";
Button* playButton = Button::create("butplay.png",
                                   "butplay_in.png"
                                    );
playButton->setPosition(Vec2(58.0f, 32.0f));
playButton->addTouchEventListener([&](Ref* sender, Widget::TouchEventType type) 
    switch (type)
    
    case ui::Widget::TouchEventType::BEGAN:
        break;
    case ui::Widget::TouchEventType::ENDED:
            chosenBlockTexture = "pipo";
            CCLOG("chosenBlockTexture = %s", chosenBlockTexture.c_str());
        break;
    default:
        break;
    
 );

输出是: selectedBlockTexture = ~\336

上面的例子可以编译,但是 CCLOG 没有给出结果字符串“pipo”。

当按下按钮时,var 超出范围,它会给出意想不到的结果(我使用 xcode ios)。

如果我将 selectedBlockTexture 设为私有变量(将变量设为私有 var,并将其从方法中删除),它的工作正常且输出为“chosenBlockTexture = pipo”。

 private:
    std::string chosenBlockTexture = "123";
;

【讨论】:

以上是关于如何更改 lambda 表达式中的字符串变量?的主要内容,如果未能解决你的问题,请参考以下文章

Lambda 演算入门

如何从字符串为深层属性创建表达式树/lambda

如何创建自定义查找功能?

如何使用正则表达式更改具有特定值的字符串中的值?

3.(补充)python中的lambda表达式的基本使用

Kotlin函数 ⑤ ( 匿名函数变量类型推断 | 匿名函数参数类型自动推断 | 匿名函数又称为 Lambda 表达式 )