我不是SWIFT程序员,所以我对这种语言一无所知.我只是出于好奇才问的.
我遇到了一种语言构造,其中变异函数中的self
被赋予一个新值,如下面示例中的函数moveByAssigmentToSelf
所示.
struct Point {
var x = 0.0
var y = 0.0
mutating func moveByAssigmentToSelf(_ deltaX: Double, _ deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
mutating func moveByMutatingMembers(_ deltaX: Double, _ deltaY: Double) {
self.x += deltaX
self.y += deltaY
}
}
来自C/C++/Java/C#背景的我认为self
是指向内存中(例如堆栈上)某个地方的 struct 值(开始)的指针(地址).
对我来说,在C++ struct 中为应该等同于this
的东西赋值看起来非常奇怪.在AFAICT中,函数moveByMutatingMembers
应该具有观察上等价的效果,并且将是在C++/Java世界中自然要做的事情.
有人能向非SWIFT程序员解释一下这一概念背后的基本原理/理念是什么吗?
在语言参考(关于表达的章节)中,我能找到的只是以下含糊的陈述:"In an initializer, subscript, or instance method, self refers to the current instance of the type in which it occurs."和"In a mutating method of a value type, you can assign a new instance of that value type to self."
我试图理解的是,为什么这个任务是一个好主意,与传统解决方案相比,它解决了哪些编程问题?
换句话说:Why does this make sense from a language-design perspective? Or: What would you lose if you had to do it the C++/Java way?
顺便说一句,出于好奇,我看了一下这个例子中的龙箭disassembly,对于我未经训练的眼睛来说,moveByAssigmentToSelf
的输出与替代方案相比看起来效率低得可怕.