从前学习 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 中各种花样操作符重载的 让代码难以理解.
1
saintarion 2015-04-24 15:11:57 +08:00 1
强大的操作符重载有利于开发DSL,但是会带来各种隐藏实现和黑魔法,这是双刃剑,在封闭环境领域会很有作用,但是不利于标准化,难于维护重构。就像是scala,学院派很欢迎,充满了学术气息和优美的语法,就像是哈利波特的世界,迷人但是神秘,还排斥麻瓜。
|
2
banxi1988 OP @saintarion 但是我看到我上面所例的JSON序列化使用操作符重载的例子,我就没有觉得有任何好处,除了可能少了几个字符.
而且,像这种象形式的写法真的好吗? |