學(xué)習(xí)kotlin的時(shí)候默穴,我們看到這樣一個(gè)交換兩個(gè)int值的語法
var a = 1
var b = 2
a = b.apply{
b = a
}
//或者a=b.also{b=a},總之所有返回this的擴(kuò)展都行
println("a=$a, b=$b");
運(yùn)行代碼發(fā)現(xiàn)鼓择, a脯爪, b確實(shí)互換了则北,現(xiàn)在a=2, b=1,記住這個(gè)語法簡單,但關(guān)鍵是要理解它為什么能達(dá)到互換值的目的痕慢。尤其是像我這種C++思想已經(jīng)根深蒂固的人尚揣,一開始可能會(huì)很迷惑,會(huì)產(chǎn)生這樣的疑問掖举, 明明在apply內(nèi)部b已經(jīng)變成1了快骗,你再返回this 不也是1嗎,因?yàn)閠his指向的就是b啊。 那最終a不也成1了方篮?
如果你和我一樣名秀,c++思想根深蒂固,學(xué)習(xí)kotlin的時(shí)候 認(rèn)為很簡單的地方 又是一目十行的話藕溅,就會(huì)產(chǎn)生如此疑問匕得。
那么我們回頭去看看,就會(huì)發(fā)現(xiàn)巾表,在kotlin中一切都是對象汁掠,并沒有c++或者java中所謂的基本類型。 那現(xiàn)在我們理解了a集币,b都是對象就好理解一些了考阱, apply的作用是執(zhí)行{}內(nèi)的代碼塊,并返回this惠猿。 那么b=a相當(dāng)于讓b這個(gè)對象變量指向了原來a對象。 但原始的b對象本身還在负间,也就是我們將要返回的那個(gè)this還是原始的b偶妖, 然后是a=this(原始的b),這就達(dá)到了a政溃,b對象指向互換趾访。我把它翻譯成c++代碼,可能更好理解董虱,原理是一樣的扼鞋。 假設(shè)我們在c++中也有一個(gè)用于表示整數(shù)類型的類叫 MyInt那么 我們也實(shí)現(xiàn)一個(gè)類函數(shù)叫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);
這樣依然達(dá)到了a,b兩個(gè)指針互換的目的(a云头,b指向的內(nèi)存地址互換)。
您現(xiàn)在應(yīng)該理解了淫半。