从前学习 C++的时候,认识到各种花样的操作符重载的问题,引起过不少争论和问题
因此有很多语言是不提供操作符重载的.
现在 Swift 是我所知对操作符重载支持最好的语言了.
各种自定义支持
示例:
Swift
prefix func - (vector: Vector2D) -> Vector2D {
return Vector2D(x: -vector.x, y: -vector.y)
}
参考:
https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html#//apple_ref/doc/uid/TP40014097-CH27-ID28
还可以重新声明各种运算符,如:
Swift
infix operator +- { associativity left precedence 140 }
文档中的一符操作符重载还是,比较直观易懂的.
下面是我所忧心的:
今天在Github 趋势中浏览 Swift 项目时,
发现一个 JSON 序列化的库: https://github.com/thoughtbot/Argo
主页的上的一个花样运算符重载马上让我惊呆了:
Swift
static func decode(j: JSONValue) -> User? {
return User.create
<^> j <| "id"
<*> j <| "name"
<*> j <|? "email" // Use ? for parsing optional values
<*> j <| "role" // Custom types that also conform to JSONDecodable just work
<*> j <| ["company", "name"] // Parse nested objects
<*> j <|| "friends" // parse arrays of objects
}
我是比较笨的人,看了一陈子,没有明白这样的操作符重载是为哪般.
明显是增加代码理解难度嘛.
别个一个出名的 Swift 库对此则克制一些.
Bond https://github.com/SwiftBond/Bond
主要定义了以下三个新的操作符:
Swift
infix operator ->> { associativity left precedence 105 }
infix operator ->| { associativity left precedence 105 }
infix operator <->> { associativity left precedence 100 }
不过不看源代码, 还是不好明白这些操作符到底要做什么..
我忧心的是,Swift 中各种花样操作符重载的 让代码难以理解.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.