【发布时间】:2015-02-02 17:06:43
【问题描述】:
我开始使用 Swift。我以前的编程背景主要是 Python,所以我倾向于在 Swift 中搜索 Pythonic 的编码方式,幸运的是它部分受到了 Python 的启发。在 Python 中,有一种非常强大的方法可以通过使用特殊方法来重载类中的运算符。我知道我们可以通过在特定名称空间中定义一个函数来重载 Swift 中的运算符,我们想要这种特殊行为,但我还没有找到一种方法来按类重载运算符。
编辑 - 添加示例。
class Vector(object):
def __init__(self, *args): # Initializing a vector of random size
self.vector = tuple(args)
def __len__(self): # This sources the data to the built-in len() function
return len(self.vector)
def __getitem__(self, i): # Overloads [ ] operator
return self.vector[i]
def __add__(self, vector): # Overloads + operator
if len(self) != len(vector):
raise ValueError("Vectors should be of equal length")
return tuple([self.vector[i] + vector[i] for i in xrange(len(self))])
a, b = Vector(1, 2, 3, 4), Vector(2, 3, 4, 5) # My modified tuples
print(a + b) # this operation is affected
print((1, 2, 3, 4) + (2, 3, 4, 5)) # this is not, since these are standard tuples
输出:
(3, 5, 7, 9)
(1, 2, 3, 4, 2, 3, 4, 5)
在这里,我刚刚通过定义 add 方法重载了 +,并通过定义 getitem 方法重载了 []。该类可以从 Python 中的元组类型以及初始化程序中继承 [] 行为,但我手动进行了所有操作以提供更多详细信息。由于重载被封装在类中,它不会影响一般的运算符行为,因为所有类型和类都定义了自己的特殊方法。
【问题讨论】:
-
所以也许你会悄悄告诉 Swift 专家,它是如何在 Python 中完成的。
-
一般来说,Swift 中的运算符重载总是全局的。您可以做的最接近的方法是创建特定于类型的运算符重载。此外,正如 Thomas 所说,如果您提供所有相关信息,您更有可能得到有用的答案。
-
@ThomasKilian 我刚刚添加了一个示例。
-
@David 现在有一个例子。
标签: python swift operator-overloading