当前位置: 首页 > 知识库问答 >
问题:

如何构建Rc或Rc?

吴同
2023-03-14

我想创建一个Rc

Rc有一个?大小绑定:

pub struct Rc<T: ?Sized> { /* fields omitted */ }

我还听说Rust 1.2将提供适当的支持,用于在Rc中存储未调整大小的类型,但我不确定这与1.1有何不同。

str案例为例,我天真的尝试(也是从字符串构建的尝试)失败了:

use std::rc::Rc;

fn main() {
    let a: &str = "test";
    let b: Rc<str> = Rc::new(*a);
    println!("{}", b);
}
error[E0277]: the trait bound `str: std::marker::Sized` is not satisfied
 --> src/main.rs:5:22
  |
5 |     let b: Rc<str> = Rc::new(*a);
  |                      ^^^^^^^ `str` does not have a constant size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `str`
  = note: required by `<std::rc::Rc<T>>::new`

很明显,为了创建Rc

我被告知不能实例化这样的类型,而是实例化Rc


共有2个答案

顾正初
2023-03-14

创建Rc

use std::rc::Rc;

fn main() {
    let x: Rc<[i32; 4]> = Rc::new([1, 2, 3, 4]);

    let y: Rc<[i32]> = x;

    println!("{:?}", y);
}

然而,这对字符串不起作用,因为它们没有原始的固定大小的等价物来创建第一个值。这可能是不安全的,例如通过创建一个UTF-8编码的Rc

另一种选择是owning_ref,它本身并不是std::rc::rc,但应该允许,例如,获取RcRef

extern crate owning_ref;
use owning_ref::RcRef;
use std::rc::Rc;

fn main() {
    let some_string = "foo".to_owned();

    let val: RcRef<String> = RcRef::new(Rc::new(some_string));

    let borrowed: RcRef<String, str> = val.map(|s| &**s);

    let erased: RcRef<owning_ref::Erased, str> = borrowed.erase_owner();
}

擦除意味着RcRef

注意。在撰写本文时,使用RcRef进行擦除需要夜间编译器,并且取决于owning\u refnightly功能

[dependencies]
owning_ref = { version = "0.1", features = ["nightly"] }

伊光赫
2023-03-14

从1.21开始。根据RFC 1845的规定,创建Rc

use std::rc::Rc;
use std::sync::Arc;

fn main() {
    let a: &str = "hello world";
    let b: Rc<str> = Rc::from(a);
    println!("{}", b);

    // or equivalently:
    let b: Rc<str> = a.into();
    println!("{}", b);

    // we can also do this for Arc,
    let a: &str = "hello world";
    let b: Arc<str> = Arc::from(a);
    println!("{}", b);
}

(游乐场)

参见

 类似资料:
  • RC

    ReplicationController 1 - 创建工程 $ oc new-project test 2 - 创建 rc.yaml,内容如下 apiVersion: v1 kind: ReplicationController metadata: name: mysql spec: replicas: 1 selector: app: mysql template:

  • JavaScript 实现的任意大小,任意方向, 任意角度的箭头。 示例截图 简单箭头 模拟select 发散箭头 安装 npm install rc-arrow --save import Arrow from 'rc-arrow'class Hw extends Component {    render() {        return (            <Arrow size="

  • 项目介绍: 基于`Leaflet`引擎的`React`地图组件,支持`TypeScript` 由数据驱动地图元素的添加与移除,完整的声明周期控制 支持特性: 支持TypeScript Popup,Tooltip,DivIcon组件支持JSX内容 支持海量点位组件 支持聚合点位组件 支持主题定制 支持按需加载 支持插件: rc-leaflet-drawing 后续规划: LayerGroup,Fea

  • rc-bullets 是一个基于 CSS3 Animation,使用 React 构建的可扩展、高性能弹幕组件。 特性 支持传入 React 组件,灵活控制弹幕内容和 UI,并提供一个默认样式组件:<StyledBullet/> 弹幕屏幕管理:清屏,暂停,隐藏(后续可能会加入针对单个弹幕的控制) 弹幕动画参数化:运动函数(匀速/ease/步进/cubic-bezier)、时长(秒)、循环次数、延迟

  • 问题内容: 我正在尝试使用Selenium RC + Nunit + asp.net测试我的网站。 我可以让我的测试在Firefox,Safari,opera,IE 8中运行,但不能在谷歌浏览器中运行。我把它放在浏览器上 尽管这总是会加载Firefox,但不会加载优质的chrome。 问题答案: 如果我没记错的话, “”用于启动Firefox的特殊模式 (这种模式下,您的应用程序具有更多特权-更少

  • 我正在构建一个Azure函数项目,所以我不能以.NET5为目标。相反,我的项目是一个 。然而,当我的项目被构建时,只要有一些信息被打印出来,我就会看到DotNet5被提到。示例: 警告/usr/share/dotnet/sdk/5.0.101/microsoft.common.currentversion.targets(2123,5):警告MSB3245:无法解析此引用。找不到程序集“Syste