我想使用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上进行二进制搜索?并且这个问题的共同点是实现浮点数的总排序和相等,不同之处仅在于散列或迭代.
我有一个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
使用的)。
我尝试过一些符号:
if let Some(&y) = x.get(&3)
:复制值,但 y 不可变 ( y: i8 …
我有一个在字段上实现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) 我目前在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)