Перегрузка оператора D
import std.stdio;
struct Vector2
{
float x, y;
this (float x, float y)
{
this.x = x;
this.y = y;
}
// vector2 * number
Vector2 opBinary(string op)(const float rhs)
if (op == "*")
{
auto result = this;
this *= rhs;
return this;
}
// number * vector2
Vector2 opBinaryRight(string op)(const float lhs)
if (op == "*")
{
return this.opBinary!(op)(lhs);
}
/*
assignment operators
*/
// vector2 = vector2
ref Vector2 opAssign(const ref Vector2 rhs)
{
x = rhs.x;
y = rhs.y;
return this;
}
// vector2 *= number
ref Vector2 opOpAssign(string op)(const float rhs)
if (op == "*") {
x *= rhs;
y *= rhs;
return this;
}
}
unittest
{
auto first = Vector2(1, 2);
auto second = Vector2(3, 3);
auto number = 4.0f;
Vector2 result = first *= 3;
assert(result == Vector2(3, 6));
// BUG *
// assert(first == Vector2(1, 2));
}
void main()
{}
Привет. Когда я пытаюсь скомпилировать эту маленькую программу с параметром -unittest, почему последнее утверждение не выполняется? Любая помощь будет оценена. Спасибо..
1 ответ
Решение
Почему вы ожидаете, что это пройдет?
first *= 3
модифицирует first
, поэтому он не сохраняет свое первоначальное значение.
Возможно, вы хотели написать
Vector2 result = first * 3;
?
Существует также проблема с Vector2 opBinary(string op)(const float rhs)
Эта функция - то, что используется в выражении как 10 * v
, Ваш код изменяется this
в выражении this *= rhs
, Эта функция должна быть реализована:
auto result = this;
result *= rhs;
return result;