如何在Rust中定义函数?

时间:2019-01-18 05:06:50

标签: rust

我决定在Rust中做2D矢量叉积。在JavaScript中,这很容易做到:

float CrossProduct( const Vec2& a, const Vec2& b ) {
    return a.x * b.y - a.y * b.x;
}

我试图将其转换为Rust系统:

// Just created two separate variables for the two different vectors

let vec1 = vec![1.15, 7.0];
let vec2 = vec![7.0, 2.0];
let cross_product(&vec1, &vec2) = vec1[0] * vec2[1] - vec1[1] * vec2[0];
println!("{}", cross_product);

// I also tried return.
let vec1 = vec![1.15, 7.0];
let vec2 = vec![7.0, 2.0];
let cross_product(&vec1, &vec2) {
    return (vec1[0] * vec2[1] - vec1[1] * vec2[0]);
}
println!("{}", cross_product);

我以为其中的一种会起作用,但是对我而言,这更像是一个现实检查,Rust与以前使用的任何语言有何不同。

我发现解决此问题的方法效率很低,但是我宁愿学习正确地做到这一点。我是Rust的新手,所以请尝试一下盐。

2 个答案:

答案 0 :(得分:1)

您似乎主要在Rust语法方面遇到问题。您可以创建叉积函数或内联叉积。

sum

如果需要功能,可以连续使用。

df$value <- df$value + sapply(l[match(df$id, names(l))], sum)
df

#  id value
#1  a     6
#2  b     7

第二种解决方案可能会产生误导,因为即使传递不同大小的向量,它也总是会产生2x2向量的叉积。

答案 1 :(得分:1)

有两种可能的方法。

第一条路

您可以声明一个函数并将其传递给println!(),这与许多编程语言(例如Java,C#等)相似。

//Declare the function
fn cross_product(slice1: &[i32], slice2: &[i32]) -> i32 {
    slice1[0] * slice2[1] - slice1[1] * slice2[2]
}

//Use it Like following
fn main() {
    let vec1 = vec![1, 2, 3];
    let vec2 = vec![4, 5, 6];

    println!("{}", cross_product(&vec1[..], &vec2[..]));
}

第二种方式

您可以声明闭包并将其传递给函数编程中的一种常见方法println!()

// You can declare a closure and use it as function in the same code block
fn main() {
    let vec1 = vec![1, 2, 3];
    let vec2 = vec![4, 5, 6];

    let cross_product = |slice1: &[i32], slice2: &[i32]| -> i32 {
        let result = slice1[0] * slice2[1] - slice1[1] * slice2[2];
        result
    };

    println!("{}", cross_product(&vec1[..], &vec2[..]));
}

请注意,我已经使用i32数据类型创建了向量和闭包,该数据类型对应于一个整数。您可以使用f32更改类型,也可以使用更大的浮动范围f64