美文网首页
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)

    学习kotlin的时候,我们看到这样一个交换两个int值的语法 运行代码发现, a, b确实互换了,现在a=2, ...

  • 【基础学习】C 指针实现数字交换

    通过 temp 交换 a、b 的值。 通过把 a、b 的指针传到 swap 方法中,实现数字的交换,因为方法是传值...

  • Swift语言自带的实用技巧!!!

    开胃菜 交换两个变量的值,使用元组(a,b) = (b,a) 系统自带的交换函数 : swap(&a,&b) 数...

  • CAS (Compare And Swap or Compare

    Compare And Swap 比较并交换 (读取 > 修改 > CAS 拿之前读取值和现存值一致时执行交换)...

  • CAS简化理解

    CAS 介绍 Compare and Swap,即比较再交换,其中有内存值V,旧值A,需要置换的值B,当V=A时,...

  • 算法

    一、交换A和B的值 1.中间变量 void swap(int a, int b) {int temp = a;a ...

  • golang中指针简要说明

    针对golang中的指针,当时理解有些误区,现写文档来进行说明 想要做的事情是交换两个变量的值,即常用的Swap函...

  • C++11 标准库源代码剖析:连载之六

    std::swap() std::swap()是一个很简单的函数:交换两个参数的值,仅此而已。但是这个看似平淡无奇...

  • java虚拟机--锁优化

    CAS:Compare and Swap 即:比较并交换 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值...

  • 使用ref和out参数

    1.交换两个数的值 static void swap(int x,int y){ int temp = x; ...

网友评论

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

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