以語法和傳統的C比較相近的Rust為例
struct Point {
x: i32,
y: i32,
}
let origin = Point { x: 0, y: 0 };
//^^^^^^^^構造^^^^^^^^^
match origin {
Point { x: x, y: y } => println!("({},{})", x, y),
//^^^^^^^^解構^^^^^^^^^
}
via Patterns
但是解構數據結構都用模式匹配也有不方便的地方, 當數據結構比較"淺"的時候, 模式匹配還是比較好用, 就像上面的例子壹樣, 但是當數據結構比較"深"的時候, *只有*模式匹配的語言做get/set操作就略麻煩
data Person = P { name :: String
, addr :: Address
}
data Address = A { street :: String
, city :: String
, postcode :: String
}
setPostcode :: String -> Person -> Person
setPostcode pc p = p { addr = addr p { postcode = pc }}
via /Tech/Haskell%20Exchange%202013
因為postcode這個成員藏得比較深, 想壹次過set postcode, 做的解構次數會很多, 實際中肯定會存在這種情況, 想壹下各種壹層嵌壹層的JSON. 其中壹個解決方法就是用壹個中間變量先把address拿出來, 再拿postcode. 這就失去了 @肖劍 在評論提到的可以減少中間變量的便利.
如果能像OO用"."來訪問: person.address.postcode = newPostcode , 不是更加方便?
深入下去偏離題目討論的內容, 關於"."的話可以看Erik Merijer的 The essence of data access in cω: The power is in the dot.
Haskell對這個問題的解決辦法是lens: Lenses, Folds and Traversals這個庫, 這是個簡單的介紹 /patrickt/d43031e3b69f1a4ff8c9 , 記住, 千萬不要看實現, 千萬不要!