如何在通道上发送插值字符串?

时间:2015-04-27 02:13:09

标签: rust

如何将变量存储在字符串中?我已经阅读了这些示例,但它们都只是println!()

//javascript
var url_str = "http://api.weather/city" + city_code + "/get";

//go
urlStr := fmt.Sprintf("http://api.weather/%s/get", cityCode)

// Edit: Rust 
let url_str = format!("http://api.openweathermap.org/data/2.5/weather?q={}", city_code);

我正在使用tx.send()并希望在频道上发送内插字符串,如下所示:

let url_str = "http://api.weather";
c.send(url_str);

但是我收到了错误

src/http_get/http_getter.rs:21:17: 21:24 error: `url_str` does not live long enough
src/http_get/http_getter.rs:21         c.send(&url_str);
                                           ^~~~~~~

以下是我尝试实现的用于构建URL的函数:

pub fn construct_url(c: &Sender<String>, city_code: &str) {
        let url_str = format!("http://api.openweathermap.org/data/2.5/weather?q={}", city_code);
        println!("{}", url_str);
        c.send(url_str);
}

1 个答案:

答案 0 :(得分:3)

随着生命周期和类型的恢复,这就是你所拥有的:

pub fn construct_url<'a, 'b, 'c>(c: &'a Sender<&'b str>, city_code: &'c str) {
    let url_str: String = format!("http://api.openweathermap.org/data/2.5/weather?q={}", city_code);
    println!("{}", url_str);
    c.send(&url_str);
}

请记住String&str之间的区别:&str是一个字符串切片,是对其他人拥有的字符串的引用; String是拥有的品种。

'b必须至少与整个函数体一样长 - 你在函数内构造的任何字符串都不会长到'b。因此,您的发件人需要发送String,而不是&str

pub fn construct_url(c: &Sender<String>, city_code: &str) {
    let url_str = format!("http://api.openweathermap.org/data/2.5/weather?q={}", city_code);
    println!("{}", url_str);
    c.send(url_str);
}