美文网首页
Kotlin交换值的理解(swap)

Kotlin交换值的理解(swap)

作者: 九风特 | 来源:发表于2020-10-20 10:34 被阅读0次

    学习kotlin的时候,我们看到这样一个交换两个int值的语法

        var a = 1
        var b = 2
        a = b.apply{
            b = a
        }
       //或者a=b.also{b=a},总之所有返回this的扩展都行
        println("a=$a, b=$b");
    

    运行代码发现, a, b确实互换了,现在a=2, b=1,记住这个语法简单,但关键是要理解它为什么能达到互换值的目的。尤其是像我这种C++思想已经根深蒂固的人,一开始可能会很迷惑,会产生这样的疑问, 明明在apply内部b已经变成1了,你再返回this 不也是1吗,因为this指向的就是b啊。 那最终a不也成1了?
    如果你和我一样,c++思想根深蒂固,学习kotlin的时候 认为很简单的地方 又是一目十行的话,就会产生如此疑问。
    那么我们回头去看看,就会发现,在kotlin中一切都是对象,并没有c++或者java中所谓的基本类型。 那现在我们理解了a,b都是对象就好理解一些了, apply的作用是执行{}内的代码块,并返回this。 那么b=a相当于让b这个对象变量指向了原来a对象。 但原始的b对象本身还在,也就是我们将要返回的那个this还是原始的b, 然后是a=this(原始的b),这就达到了a,b对象指向互换。我把它翻译成c++代码,可能更好理解,原理是一样的。 假设我们在c++中也有一个用于表示整数类型的类叫 MyInt那么 我们也实现一个类函数叫apply,模拟上面的逻辑,我们得到如下代码

    typedef void(PFN_Block)();
    class MyInt
    {
    public:
        MyInt( int val)
        {
            _value = val;
        }
        MyInt* Apply(PFN_Block fn)
        {
            fn();
            return this;
        }
        
        int _value;
    };  
    MyInt* a = new MyInt(1);
    MyInt* b = new MyInt(2);
    void DoIt()
    {
        b = a;
    }
    a = b->Apply(DoIt);
    

    这样依然达到了a,b两个指针互换的目的(a,b指向的内存地址互换)。
    您现在应该理解了。

    相关文章

      网友评论

          本文标题:Kotlin交换值的理解(swap)

          本文链接:https://www.haomeiwen.com/subject/tqwrmktx.html