I have started creating a gaming graphics engine using this article. I chose Rust because I have heard about it and it sounds perfect for creating games. The only problem is I have no experience whatsoever. I have used Python, JavaScript, Java and HTML before.
This is the code I have written so far:
point.rs
// Point class
// Operators
struct point {
x: i32,
y: i32,
z: i32,
}
// Variables
pub fn new(x: i32, y: i32, z: i32) {
let mut point = (x, y, z);
//return point;
impl point {
fn addVectorToPoint(self: &point, (x, y, z): (i32, i32, i32)) {
let mut x = x + &self.x;
let mut y = y + &self.y;
let mut z = z + &self.z;
let mut point = (x, y, z);
}
fn subtractVectorFromPoint(self: &point, (x, y, z): (i32, i32, i32)) {
let mut x = &self.x - x;
let mut y = &self.y - y;
let mut z = &self.z - z;
let mut point = (x, y, z);
}
fn subtractPointFromPoint(self: &point, (x, y, z): (i32, i32, i32)) {
let mut x = &self.x - x;
let mut y = &self.y - y;
let mut z = &self.z - z;
let mut vector = (x, y, z);
}
}
}
main.rs
mod point;
fn main() {
let point1 = point::new(1, 2, 3);
let point2 = point::new(3, 2, 1);
let newPoint = point1.subtractPointFromPoint(point2);
println!("{:?}", newPoint);
}
When I run it, I get this:
error[E0599]: no method named `subtractPointFromPoint` found for type `()` in the current scope
--> src/main.rs:6:27
|
6 | let newPoint = point1.subtractPointFromPoint(point2);
| ^^^^^^^^^^^^^^^^^^^^^^
What I am doing wrong?
答案 0 :(得分:8)
不要指望你可以随意地在你的编辑器中输入代码,它会起作用。编程语言具有必须遵循的语法和结构规则。此外,Rust社区已经付出了很多努力来创建优秀的指南。
例如,如果您阅读The Rust Programming Language,特别是defining and instantiating structs和method syntax上的章节,您将了解到返回值的函数必须在函数签名中声明返回类型:
pub fn new(x: i32, y: i32, z: i32) -> point { /* ... */ }
您还必须
let mut point = point { x, y, z }
)这可以简化为:
pub fn new(x: i32, y: i32, z: i32) -> point {
point { x, y, z }
}
如果你没有声明一个返回类型,那就像说一个函数返回空元组一样,也称为单元类型:
pub fn new(x: i32, y: i32, z: i32) -> () { /* ... */ }
// Idiomatically written as
pub fn new(x: i32, y: i32, z: i32) { /* ... */ }
错误消息的found for type `()`
部分来自哪里。单位类型也是Rust语句的值 - 以;
结尾的表达式。这就是你的函数体编译的原因 - 它以;
结束。
存在各种其他问题:
PascalCase
等类型使用Point
。snake_case
表示变量和方法。Point
的关联函数。Point
而不是重复名称Self
。&self
代替self: &Point
&mut self
。Point
,而是接受数字元组。point1
变量,但未将其标记为可变Debug
才能打印出Point
。#[derive(Debug)]
struct Point {
x: i32,
y: i32,
z: i32,
}
impl Point {
pub fn new(x: i32, y: i32, z: i32) -> Self {
Point { x, y, z }
}
fn add_vector_to_point(&mut self, (x, y, z): (i32, i32, i32)) {
self.x += x;
self.y += y;
self.z += z;
}
fn subtract_vector_from_point(&mut self, (x, y, z): (i32, i32, i32)) {
self.x -= x;
self.y -= y;
self.z -= z;
}
fn subtract_point_from_point(&mut self, Point { x, y, z }: Point) {
self.x -= x;
self.y -= y;
self.z -= z;
}
}
fn main() {
let mut point1 = Point::new(1, 2, 3);
let point2 = Point::new(3, 2, 1);
point1.subtract_point_from_point(point2);
println!("{:?}", point1);
}
考虑实施AddAssign
和SubAssign
而不是这些自定义方法。
impl std::ops::Sub for Point {
type Output = Point;
fn sub(self, other: Point) -> Point {
Point::new(self.x - other.x, self.y - other.y, self.z - other.z)
}
}
fn main() {
let point1 = Point::new(1, 2, 3);
let point2 = Point::new(3, 2, 1);
let point3 = point1 - point2;
println!("{:?}", point3);
}