泛型函数的不同实例是否可以具有不同的静态变量?

2024-05-05

当我在泛型函数中使用静态变量时,泛型函数的每个实例中的变量实体都是相同的。

例如,在这段代码中

fn foo<T>() {
    use std::sync::{Once, ONCE_INIT};

    static INIT: Once = ONCE_INIT;

    INIT.call_once(|| {
        // run initialization here
        println!("Called");
    });
}

fn main() {
    foo::<i64>();
    foo::<i64>();
    foo::<isize>();
}

println!仅被调用一次。

我使用 Rust 游乐场检查了汇编代码,发现INIT变量与类型无关T实际上是虽然foo<T>它们自己用不同的名称实例化。

泛型函数的不同实例是否可以具有不同的静态变量,以便println!在上面的例子中被调用了两次?


不可以。Rust 不支持将静态数据绑定到通用参数。

我能想到的最接近的解决方法是使用类似typemap https://crates.io/crates/typemap用于存储每种类型一个条目的板条箱。

/*!
Add to `Cargo.toml`:

```cargo
[dependencies]
lazy_static = "0.2.8"
typemap = "0.3.3"
```
*/
#[macro_use] extern crate lazy_static;
extern crate typemap;

fn main() {
    foo::<i64>();
    foo::<i64>();
    foo::<isize>();
}

fn foo<T: 'static>() {
    use std::marker::PhantomData;
    use std::sync::Mutex;
    use typemap::{ShareMap, TypeMap};

    // Use `fn(T)` as it avoids having to require that `T` implement
    // `Send + Sync`.
    struct Key<T>(PhantomData<fn(T)>);

    impl<T: 'static> typemap::Key for Key<T> {
        type Value = ();
    }

    lazy_static! {
        static ref INIT: Mutex<ShareMap> = Mutex::new(TypeMap::custom());
    }

    INIT.lock().unwrap().entry::<Key<T>>().or_insert_with(|| {
        println!("Called");
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

泛型函数的不同实例是否可以具有不同的静态变量? 的相关文章

随机推荐

  • 如何启动 VBS 的交互式控制台?

    与这个问题非常相似 如何启动 Perl 的交互式控制台 https stackoverflow com questions 73667 how can i start an interactive console for perl 我只是希
  • 如何使用正则表达式替换匹配的组值

    我想修改连接字符串中 数据源 组件的值 我正在考虑以下解决方案 使用这个正则表达式模式 data source w 1 w 我可以获得以下字符串匹配 Match Groups 0 Value data source MY PC SQLEXP
  • GCD获取队列名称/标签

    如何获取当前队列名称 我的意思是队列标签com example myqueue 在 Xcode 4 调试器中我只能看到 block invoke 1 怎么样dispatch queue get label http developer ap
  • 运行时 SQL 查询生成器

    我的问题类似于 Java中有什么好的动态SQL生成器库吗 https stackoverflow com questions 5620985 is there any good dynamic sql builder library in
  • aspnet webforms禁用提交按钮

    我在 Webforms 中遇到一个小问题 我正在尝试禁用提交时的提交按钮 以防止重复发布 问题是 如果在回发期间禁用提交按钮 则不会调用代码隐藏中的 onclick 方法 回发仍然发生 但按钮 onclick 方法不会被调用 有办法解决这个
  • 如何设计多租户mysql数据库[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设我需要设计一个数据库来托管多个公司的数据 现在 出于安全和管理目的 我需要确保不同公司的数据正确隔离 但我也不想启动 10 个 m
  • 如何使用 ASP.NET Core 进行流式传输

    如何在 ASP NET Core 中正确传输响应 有一个像这样的控制器 更新的代码 HttpGet test public async Task GetTest HttpContext Response ContentType text p
  • WCF服务契约上的数据注释

    我有一个 WCF 服务 其中定义了一个 DataContract 类 每个属性都有 DataMember 属性 并且我已向其中几个属性添加了几个数据注释属性 Required 和 StringLength 然后 我在 ASP NET MVC
  • Javascript 中左侧的可选链接

    是否可以使用可选链接 https developer mozilla org en US docs Web JavaScript Reference Operators Optional chaining运算符位于赋值的左侧 在 JavaS
  • 为 UILabel 设置不同字体的问题

    我想将字体大小和姓氏设置为 titleLabel Helvetica Neue UltraLight titleLabel setFont UIFont fontWithName Helvetica Neue UltraLight size
  • 如何允许Windows Server上的MySQL进行外部远程访问?

    我已经在我的 Windows Server 2008 R2 上安装了 xampp 我在那里运行一个脚本来存储当天的数据 现在我想通过 mysql connect hostname username pw 连接数据库从我自己的计算机或外部检索
  • 绝对定位的元素如何在没有任何 z-index 的情况下与后续/下一个元素重叠?

    请看我的fiddle http jsfiddle net CNKsx here 我试图了解绝对定位的 红色六边形 图标如何在没有 z index 的情况下与 input textarea 元素重叠
  • 如何在android aidl 文件中返回MyObject 列表?

    我的 aidl 文件中有这个方法 void getObjects out List
  • 如何从 colorbox 获取返回值?

    我有一个颜色框 可以让用户选择图像 如何从颜色盒中获取文件名 我注意到onClosed功能 解决方案 正如 Gummy 所建议的 我使用了 onComplete 函数 如以下代码所示 返回 页面
  • 如何找到哪个 rspec 测试花费了这么长时间

    我们的一个 或几个 测试花费了很长时间 我们希望对其进行优化 我们已经进行了 1000 次测试 因此对我来说运行每个文件是不切实际的 有没有一种简单的方法可以找到慢的 这是 rspec 1 3 在 RSpec 2 和 3 中 您可以使用 p
  • 如何让图片在div中居中?

    我的 HTML 代码如下所示 div class ctn img src some img jpg div The ctn应该是固定大小 例如 150 150 但 IMG 的尺寸可能更大或更小 200 50 50 200 50 50 等 如
  • 非聚合查询内部的聚合情况

    我有一个相当大的查询 其最简单的形式如下所示 select r rep id u user id u signup date pi application date pi management date aum from table1 r
  • Flutter 中的 SharedPreferences 错误

    我正在使用shared preferences我的 Flutter 应用程序中的插件 从某个时刻开始 可能是在 Flutter 升级之后 它开始抛出异常 E flutter 27778 ERROR topaz lib tonic loggi
  • 如何使用 angularjs 更改 iframe src

    p Your browser does not support iframes p 如何修改iframe的src 你还需要 sce trustAsResourceUrl否则它不会打开 iframe 内的网站 JSFiddle http js
  • 泛型函数的不同实例是否可以具有不同的静态变量?

    当我在泛型函数中使用静态变量时 泛型函数的每个实例中的变量实体都是相同的 例如 在这段代码中 fn foo