学习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指向的内存地址互换)。
您现在应该理解了。
网友评论