小编pix*_*nil的帖子

如何在Rust中使用带有f64的HashMap作为键?

我想使用a HashMap<f64, f64>,用于将已知x和y的点的距离保存到另一个点.f64因为价值在这里无关紧要,重点应放在关键上.

let mut map = HashMap<f64, f64>::new();
map.insert(0.4, f64::hypot(4.2, 50.0));
map.insert(1.8, f64::hypot(2.6, 50.0));
...
let a = map.get(&0.4).unwrap();
Run Code Online (Sandbox Code Playgroud)

由于f64既不是Eq也不是Hash,只是PartialEq,f64不足以作为重点.我需要先保存距离,但也要稍后通过y访问距离.y的类型需要是浮点精度,但如果不起作用f64,我将使用i64带有已知指数的.

我通过使用自己的方法尝试了一些hacks struct Dimension(f64),然后Hash通过将float转换为a String然后对其进行哈希来实现.

#[derive(PartialEq, Eq)]
struct DimensionKey(f64);

impl Hash for DimensionKey {
    fn hash<H: Hasher>(&self, state: &mut H) {
        format!("{}", self.0).hash(state);
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎非常糟糕,两个解决方案,我自己的struct或float作为带有base和exponent的整数似乎对于一个键来说非常复杂.

更新:我可以保证我的密钥永远不会是NaN,或者是无限的价值.此外,我不会计算我的密钥,只是迭代它们并使用它们.因此,已知错误应该没有错误0.1 + 0.2 ? 0.3. 如何在Vec of Floats上进行二进制搜索?并且这个问题的共同点是实现浮点数的总排序和相等,不同之处仅在于散列或迭代.

floating-point hashmap rust

8
推荐指数
4
解决办法
2902
查看次数

如何在 if-let 语句中将复制的变量引入为可变的?

我有一个HashMap<i8, i8>可以包含循环的:

let mut x: HashMap<i8, i8> = HashMap::new();
x.insert(1, 6);
x.insert(3, 5);
x.insert(5, 1);
Run Code Online (Sandbox Code Playgroud)

要获得 的最终值3,应该首先查找x[3],然后x[5]最后查找x[1]哪个应该产生6。我决定使用while let循环:

let mut y = x[&3]; // y: i8
while let Some(&z) = x.get(&y) {
    y = z;
}

println!("{}", y);

x.insert(0, 0);
Run Code Online (Sandbox Code Playgroud)

这工作正常,但panic!如果3不在地图上,它就会工作。由于我不想对这种None情况做任何事情,所以我想使用 a if let(类似于while let使用的)。

我尝试过一些符号:

  1. if let Some(&y) = x.get(&3):复制值,但 y 不可变 ( y: i8 …

mutable rust

5
推荐指数
1
解决办法
5499
查看次数

如何对Serde(deserialize_with)中使用的反序列化功能进行单元测试?

我有一个在字段上实现Deserialize和使用的结构serde(deserialize_with)

#[derive(Debug, Deserialize)]
struct Record {
    name: String,
    #[serde(deserialize_with = "deserialize_numeric_bool")]
    is_active: bool,
}
Run Code Online (Sandbox Code Playgroud)

deserialize_numeric_bool字符串“ 0”或“ 1”反序列化为相应的布尔值的实现:

pub fn deserialize_numeric_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
    where D: Deserializer<'de>
{
    struct NumericBoolVisitor;

    impl<'de> Visitor<'de> for NumericBoolVisitor {
        type Value = bool;

        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
            formatter.write_str("either 0 or 1")
        }

        fn visit_u64<E>(self, value: u64) -> Result<bool, E>
            where E: DeserializeError
        {
            match value {
                0 => Ok(false),
                1 => Ok(true),
                _ …
Run Code Online (Sandbox Code Playgroud)

unit-testing rust serde

5
推荐指数
2
解决办法
95
查看次数

连接Javascript中的函数

我目前在js组件中工作,我想知道是否有更好的方法来连接javascript中的函数然后返回this。我有一个示例代码在这里工作,这就是我解决问题的方式。

function hi(){
  console.log('hi');
  return this;
}
function bye(){
  console.log('bye');
  return this;
}
function Test(){};

Test.prototype.hi = hi;
Test.prototype.bye = bye;

var x = new Test();

x
 .hi() //hi
 .bye(); //bye
Run Code Online (Sandbox Code Playgroud)

javascript

1
推荐指数
1
解决办法
1894
查看次数