简体   繁体   English

Rust“性状`借<char> ` 没有为 `&amp;str` 实现“错误</char>

[英]Rust "the trait `Borrow<char>` is not implemented for `&str`" Error

My programs code and decode the texts.我的程序对文本进行编码和解码。 The coding part was succesful but decoding part doesn't work.编码部分成功,但解码部分不起作用。

The logic is so simple;逻辑很简单; take code until come x (you can imagine, x is delimeter as like comma from CSV), find in dictionary and add it to variable.取代码直到x (你可以想象,x 是分隔符,就像 CSV 中的逗号一样),在字典中找到并将其添加到变量中。

cl01xcl01 => aa
----|----
 a  | a
    V
    Delimiter

But it throws error:但它会引发错误:

[hoovy@turbine Coder]$ cargo build
   Compiling bimap v0.6.1
   Compiling Coder v0.1.0 (/home/hoovy/.Projeler/Programlama/Rust/Coder)
error[E0277]: the trait bound `&str: Borrow<char>` is not satisfied
   --> src/Coder.rs:185:57
    |
185 |             decoded = format!("{}{}",result_raw,letters.get_by_right(&code).unwrap());
    |                                                         ^^^^^^^^^^^^ the trait `Borrow<char>` is not implemented for `&str`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `Coder` due to previous error
[hoovy@turbine Coder]$

NOTE: I used bimap crate.注意:我使用了 bimap 板条箱。

//-------------------------//
#![allow(non_snake_case)]
//-------------------------//
#![allow(dead_code)]
//-------------------------//
#![allow(unused_variables)]
//-------------------------//
#![allow(unused_imports)]
//-------------------------//

#[cfg(doc)] #[doc = include_str!("../Changelog.md")] pub mod _changelog{}

use std::io;
use bimap::BiMap;
use std::process::exit;

fn input() -> String {
    let mut input = String::new();
    println!("Enter the text that you want to encrypt:");
    match io::stdin().read_line(&mut input) {
        Ok(_) => {
                return input.to_string();
            },
        Err(e) => {
            return e.to_string();
        }
    }
}

fn coder(flag: &char) -> String {
    let mut letters = BiMap::<char, &str>::new();
    letters.insert('a',"cl01");
    letters.insert('b',"cl02");
    letters.insert('c',"cl03");
    letters.insert('d',"cl04");
    letters.insert('e',"cl05");
    letters.insert('f',"cl06");
    letters.insert('g',"cl07");
    letters.insert('h',"cl08");
    letters.insert('i',"cl08");
    letters.insert('j',"cl09");
    letters.insert('k',"cl10");
    letters.insert('l',"cl11");
    letters.insert('m',"cl12");
    letters.insert('n',"cl13");
    letters.insert('o',"cl14");
    letters.insert('p',"cl15");
    letters.insert('r',"cl16");
    letters.insert('s',"cl17");
    letters.insert('t',"cl18");
    letters.insert('u',"cl19");
    letters.insert('v',"cl20");
    letters.insert('y',"cl21");
    letters.insert('z',"cl22");

    letters.insert('w',"egl01");
    letters.insert('q',"egl02");
    letters.insert('x',"egl03");

    letters.insert('ö',"tgl01");
    letters.insert('ü',"tgl02");

    letters.insert('ß',"gl01");
    letters.insert('ä',"gl02");

    letters.insert('ç',"tl01");
    letters.insert('ğ',"tl02");
    letters.insert('ı',"tl03");
    letters.insert('ş',"tl04");
    letters.insert('û',"tl05");
    letters.insert('î',"tl06");
    letters.insert('ô',"tl07");
    letters.insert('â',"tl08");

    letters.insert('A',"clu01");
    letters.insert('B',"clu02");
    letters.insert('C',"clu03");
    letters.insert('D',"clu04");
    letters.insert('E',"clu05");
    letters.insert('F',"clu06");
    letters.insert('G',"clu07");
    letters.insert('H',"clu08");
    letters.insert('I',"clu08");
    letters.insert('J',"clu09");
    letters.insert('K',"clu10");
    letters.insert('L',"clu11");
    letters.insert('M',"clu12");
    letters.insert('N',"clu13");
    letters.insert('O',"clu14");
    letters.insert('P',"clu15");
    letters.insert('R',"clu16");
    letters.insert('S',"clu17");
    letters.insert('T',"clu18");
    letters.insert('U',"clu19");
    letters.insert('V',"clu20");
    letters.insert('Y',"clu21");
    letters.insert('Z',"clu22");

    letters.insert('W',"eglu01");
    letters.insert('Q',"eglu02");
    letters.insert('X',"eglu03");

    letters.insert('Ö',"tglu01");
    letters.insert('Ü',"tglu02");

    letters.insert('ß',"glu01");
    letters.insert('Ä',"glu02");

    letters.insert('Ç',"tlu01");
    letters.insert('Ğ',"tlu02");
    letters.insert('I',"tlu03");
    letters.insert('Ş',"tlu04");
    letters.insert('Û',"tlu05");
    letters.insert('Î',"tlu06");
    letters.insert('Ô',"tlu07");
    letters.insert('Â',"tlu08");

    letters.insert(' ',"pl01");
    letters.insert('\n',"pl02");
    letters.insert('\"',"pl03");
    letters.insert('!',"pl04");
    letters.insert('^',"pl05");
    letters.insert('#',"pl06");
    letters.insert('+',"pl07");
    letters.insert('$',"pl08");
    letters.insert('%',"pl09");
    letters.insert('/',"pl10");
    letters.insert('{',"pl11");
    letters.insert('(',"pl12");
    letters.insert('[',"pl13");
    letters.insert(')',"pl14");
    letters.insert(']',"pl15");
    letters.insert('=',"pl16");
    letters.insert('}',"pl17");
    letters.insert('?',"pl18");
    letters.insert('*',"pl19");
    letters.insert('\\',"pl20");
    letters.insert('-',"pl21");
    letters.insert('_',"pl22");
    letters.insert('@',"pl23");
    letters.insert('€',"pl24");
    letters.insert('¶',"pl25");
    letters.insert('₺',"pl26");
    letters.insert('←',"pl27");
    letters.insert('¨',"pl28");
    letters.insert('~',"pl29");
    letters.insert('ª',"pl30");
    letters.insert('™',"pl31");
    letters.insert('\'',"pl32");
    letters.insert(';',"pl33");
    letters.insert('`',"pl34");
    letters.insert(',',"pl35");
    letters.insert('«',"pl36");
    letters.insert('»',"pl37");
    letters.insert('¢',"pl38");
    letters.insert('“',"pl39");
    letters.insert('”',"pl40");
    letters.insert('µ',"pl41");
    letters.insert('®',"pl42");
    letters.insert('·',"pl43");
    letters.insert('˙',"pl44");
    letters.insert('¨',"pl45");
    letters.insert('.',"pl46");

    let ipt = input().trim_end().to_string();
    let ipt_char = ipt.chars();

    let mut result_raw = String::new();
    let result = String::new();
    let mut decoded = String::new();
    
    if *flag == 'e'
    {
        for letter in ipt_char
        {
            result_raw = format!("{}x{}",result_raw,letters.get_by_left(&letter).unwrap());
        }
        let result = &result_raw[1..];
        return result.to_string();
    }
    else if *flag == 'd'
    {
        for code in ipt_char
        {
            decoded = format!("{}{}",result_raw,letters.get_by_right(&code).unwrap());
        }
        return decoded;
    }else
    {  
        return "darn".to_string();
    }
}

fn main(){
    let a = coder(&'d');
    println!("{}",a)
}

This splits up the encoding and decoding so that they are not both trying to parse character by character.这将编码和解码分开,这样它们就不会试图逐个字符地解析。

...
letters.insert('¨', "pl45");
letters.insert('.', "pl46");

let ipt = input().trim_end().to_string();

if *flag == 'e'
{

    let ipt_char = ipt.chars();

    let mut result_raw = String::new();
    let result = String::new();
    for letter in ipt_char
    {
        result_raw = format!("{}x{}", result_raw, letters.get_by_left(&letter).unwrap());
    }
    let result = &result_raw[1..];
    return result.to_string();
} else if *flag == 'd'
{
    let mut result_raw = String::new();
    for code in ipt.split('x') {
        // You might want to have a look at the `String.push_str()` function to avoid creating a new string every time
        result_raw = format!("{}{}", result_raw, letters.get_by_right(code).unwrap());
    }
    let decoded = result_raw;
    return decoded;
} else {
    return "darn".to_string();
}
...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM