gpt4 book ai didi

rust - 将 `usize` 转换为 `&str` 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-29 08:00:33 39 4
gpt4 key购买 nike

我需要将 usize 转换为 &str 以传递给 fn foo(&str)。我找到了以下两种方法,但不知道使用as_str()Deref 是否有区别。也许 selfas_str 中所做的工作以某种方式与 Deref 链接?我不知道使用一个或另一个更好,或者它们实际上是否相同。

  1. 使用 temp.to_string().as_str():

    #[inline]
    #[stable(feature = "string_as_str", since = "1.7.0")]
    pub fn as_str(&self) -> &str {
    self
    }
  2. 使用 &*temp.to_string()&temp.to_string()。这通过 Deref 起作用:

    #[stable(feature = "rust1", since = "1.0.0")]
    impl ops::Deref for String {
    type Target = str;

    #[inline]
    fn deref(&self) -> &str {
    unsafe { str::from_utf8_unchecked(&self.vec) }
    }
    }

The question may depend on what you want to do in foo: does the passed &str need to outlive foo or not ?

foo(&str) 是此代码中 s: &str 的最小示例:

extern crate termbox_sys as termbox;

pub fn print(&self, x: usize, y: usize, sty: Style, fg: Color, bg: Color, s: &str) {
let fg = Style::from_color(fg) | (sty & style::TB_ATTRIB);
let bg = Style::from_color(bg);
for (i, ch) in s.chars().enumerate() {
unsafe {
self.change_cell(x + i, y, ch as u32, fg.bits(), bg.bits());
}
}
}

pub unsafe fn change_cell(&self, x: usize, y: usize, ch: u32, fg: u16, bg: u16) {
termbox::tb_change_cell(x as c_int, y as c_int, ch, fg, bg)
}

termbox_sys

最佳答案

如您所见,as_str 似乎没有执行任何操作。事实上,它返回 self,一个 &String,其中需要一个 &str。这会导致编译器插入对 Deref 的调用。所以你的两种方式是完全一样的。

关于rust - 将 `usize` 转换为 `&str` 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36900241/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com