我看到很多功能性編程相關主題提到破壞性更新。我知道這是類似於突變的東西,所以我理解更新部分。但是破壞性的部分是什麼?或者我只是過度思考呢?什麼是破壞性更新?
回答
您可能已經過時了一下。可變性就是它的全部;唯一被「銷燬」的是以前的值。
假設您正在使用某種搜索樹來存儲值,並且您想要插入一個新的值。發現其中新價值而來的位置後,你有兩個選擇:
有了一個不變的樹,你構建沿新值的位置的路徑新節點到根。子樹不沿着路徑在新的樹中重用,如果你仍然有一個對原始樹的根的引用,你可以同時使用它們和共享的子樹。如果你有很多不同的副本,那麼這樣可以節省空間,不需要額外的努力,當然你也擁有不可變數據結構的所有優點。
使用可變的樹,你附加它所屬的新值,就是這樣;沒有別的東西需要改變。這幾乎總是更快,並且如果你只有一個副本,那麼節省內存分配,但是任何引用「舊」樹的引用現在都有對新內存的引用。原文已被毀壞;它永遠消失了。如果你需要保留原件,你必須花費在之前創建整個的全新副本。
如果「毀滅」,似乎不必要的苛刻的方式來描述一個簡單的就地更新,那麼你可能還不如我爲了已經調試代碼,找出在地球的某個值上花了多少時間正在改變你的背後。
說得好!儘管如此,我並不認爲這是破壞性的。它只是對我來說是多餘的。無論如何,我一直認爲更新是突變。但是我認爲破壞性會給這個術語增加亟需的重點和謹慎。 :-) – Plumenator
@Plumenator:是的。 「更新」都是非常具有前瞻性和樂觀的,但可變性的缺點幾乎總是涉及到*使用的東西,而不是現在的東西。因此,「破壞性更新」這個術語對於平衡事物和清楚表明你們都在穿過橋樑並將它們燒在身後是很好的。 –
- 1. 什麼是java中的破壞性和非破壞性方法?
- 2. npm非破壞性更新
- 3. 爲什麼ListAppend是非破壞性的,而ArrayAppend和StructInsert都具有破壞性?
- 4. Cookie破壞會話破壞,爲什麼?
- 5. 什麼是導致包裝破壞?
- 6. 什麼是破壞進程內存?
- 7. 是CALayer insertSublayer:atindex:破壞性的?
- 8. brew更新破了什麼?
- 9. 爲什麼serialize()會破壞我的更新?
- 10. 爲什麼TortoiseSvn在更新期間破壞鎖定?
- 11. git中的破壞性命令是什麼?
- 12. 什麼是lisp的非破壞性版本?
- 13. 爲什麼UIPreviewActionStyle破壞性標題不是紅色的?
- 14. 非破壞性spl_autoload_register
- 15. 歸併 - 破壞性與非破壞性Java中
- 16. tfs2017上的SVN更新破壞
- 17. Appcelerator更新破壞模塊面板
- 18. 蟒蛇更新破壞了Spyder?
- 19. Rails - 破壞前更新記錄
- 20. 破壞不破壞
- 21. 破壞不破壞
- 22. Python屬性是否被破壞?
- 23. DictReader上的迭代是破壞性的
- 24. sscanf是否具有破壞性?
- 25. Laravel 5.3 DatabaseMigrations是破壞性的
- 26. 什麼是更新SPSite.LastContentModifiedDate屬性
- 27. 爲什麼位圖不會破壞?
- 28. 爲什麼libgdx SpriteBatch/BitmapFont會破壞Texture.bind?
- 29. 爲什麼我的服務被破壞?
- 30. 爲什麼我的Debug.Write被破壞?
作爲一個例子:破壞性更新將就地排序列表,而非破壞性更新將創建排序副本。破壞性將改變一個數組元素,一個對象屬性......任何作用於原始對象/數據的東西。 –