Rust 中可以使用全局变量吗?

2024-02-17

我知道一般来说,应该避免使用全局变量。尽管如此,我认为从实际意义上来说,有时需要使用它们(在变量是程序不可或缺的情况下)。

为了学习 Rust,我目前正在使用 sqlite3 和 GitHub 上的 Rust/sqlite3 包编写一个数据库测试程序。因此,(在我的测试程序中)(作为全局变量的替代方案)需要在大约有十几个函数之间传递数据库变量。下面是一个例子。

  1. 在 Rust 中使用全局变量是否可能、可行和可取?

  2. 鉴于下面的示例,我可以声明和使用全局变量吗?

extern crate sqlite;

fn main() {
    let db: sqlite::Connection = open_database();

    if !insert_data(&db, insert_max) {
        return;
    }
}

我尝试了以下操作,但它似乎不太正确并导致了以下错误(我也尝试了unsafe block):

extern crate sqlite;

static mut DB: Option<sqlite::Connection> = None;

fn main() {
    DB = sqlite::open("test.db").expect("Error opening test.db");
    println!("Database Opened OK");

    create_table();
    println!("Completed");
}

// Create Table
fn create_table() {
    let sql = "CREATE TABLE IF NOT EXISTS TEMP2 (ikey INTEGER PRIMARY KEY NOT NULL)";
    match DB.exec(sql) {
        Ok(_) => println!("Table created"),
        Err(err) => println!("Exec of Sql failed : {}\nSql={}", err, sql),
    }
}

编译时出现的错误:

error[E0308]: mismatched types
 --> src/main.rs:6:10
  |
6 |     DB = sqlite::open("test.db").expect("Error opening test.db");
  |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `std::option::Option`, found struct `sqlite::Connection`
  |
  = note: expected type `std::option::Option<sqlite::Connection>`
             found type `sqlite::Connection`

error: no method named `exec` found for type `std::option::Option<sqlite::Connection>` in the current scope
  --> src/main.rs:16:14
   |
16 |     match DB.exec(sql) {
   |              ^^^^

这是可能的,但不允许直接进行堆分配。堆分配是在运行时执行的。这里有一些例子:

static SOME_INT: i32 = 5;
static SOME_STR: &'static str = "A static string";
static SOME_STRUCT: MyStruct = MyStruct {
    number: 10,
    string: "Some string",
};
static mut db: Option<sqlite::Connection> = None;

fn main() {
    println!("{}", SOME_INT);
    println!("{}", SOME_STR);
    println!("{}", SOME_STRUCT.number);
    println!("{}", SOME_STRUCT.string);

    unsafe {
        db = Some(open_database());
    }
}

struct MyStruct {
    number: i32,
    string: &'static str,
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 中可以使用全局变量吗? 的相关文章

随机推荐

  • 将 XML 文档分开,从重复元素创建多个输出文件

    我需要获取一个 XML 文件并从输入文件的重复节点创建多个输出 xml 文件 源文件 AnimalBatch xml 如下所示
  • 忽略子文件夹中的 .git 文件夹

    是否可以将带有 git 文件夹的子文件夹添加到存储库 而不需要 Git 将其视为子模块 我尝试了不同的方法来忽略该 git 文件夹 但到目前为止没有任何效果 我在 gitignore中尝试过 vendor git 并在 vendor git
  • 全局导入的变量未定义

    我的里面有三个变量FinalVariables js如下 var finalTaskName abc var finalQuantityTaskExecuted 0 var finalQuantityTaskCompletion 100 e
  • 在Python中创建处于挂起状态的子进程

    我可以在 Python 中创建一个子进程并像这样挂起它 proc subprocess pOpen binary arg1 arg2 Subprocess was created in a running state proc handle
  • 强制 UIWebView 重绘?

    是否有任何技术可以使 UIWebView 重绘自身 我试过了setNeedsDisplay and setNeedsLayout在 UIWebView 及其 UIScrollView 上 但两者都不起作用 问完后果然找到了答案 关键是告诉子
  • 是否有用于逗号分隔的离散值列表的正则表达式?

    我使用以下正则表达式来验证逗号分隔的值列表 Dog Cat Bird Mouse Dog Cat Bird Mouse 这些值也会列在 Excel 单元格验证的下拉列表中 因此用户可以从下拉列表中选择单个值 或键入以逗号分隔的多个值 正则表
  • “不支持的模板依赖性:使用 SDK Tools v22 升级您的 Android Eclipse 插件”[重复]

    这个问题在这里已经有答案了 我最近将 Android SDK 工具升级到版本 22 但是每当我尝试在 Eclipse 中创建新项目时 都会收到一条错误消息 不支持的模板依赖项 升级您的 Android Eclipse 插件 我该如何解决这个
  • 未找到 ffprobe 或 avprobe。请安装一个

    我想向由 youtube dl 和 ffmpeg 转换的 mp3 添加标签 youtube dl o Output qpgTC9MDx1o mp3 qpgTC9MDx1o f bestaudio extract audio metadata
  • 手表是异步的吗?

    我观察一个变量radioStatus in a Vue实例 watch radioStatus function val if this discovery ajax url switch api radio val on off 它可以在
  • ' -A gnused 的等效 shell.nix 是什么' aria-label='nix-shell '' -A gnused 的等效 shell.nix 是什么'> nix-shell '' -A gnused 的等效 shell.nix 是什么

    我正在尝试探索 gnu sed 代码库 我可以从命令行执行此操作 nix shell
  • 添加联系人到 SIM 卡

    我正在尝试将联系人添加到 SIM 卡 它们似乎已添加到 SIM 卡 但只有在重新启动设备后才可见 即使是本机联系人应用程序 这是我正在使用的代码 final Uri uri Uri parse content icc adn Content
  • MySQL/SQLite/etc 数据库之间的区别?

    这是我第一次尝试使用数据库 所以请耐心等待 我需要编写一个程序来使用我还无法访问的数据库 我知道有 MySQL SQLite 和一堆其他 SQL 东西 但我不确定它们之间有什么区别 在使用它之前我是否需要知道它是什么类型的数据库 即 MyS
  • 使用 Swift 在 Xcode 中进行异步 UI 测试

    我正在编写一个发出大量网络请求的应用程序 像往常一样 他们是 async 即请求方法的调用立即返回并且结果 通过委托方法或在延迟一段时间后在闭包中传递 现在 在我的注册屏幕上 我向后端发送了一个注册请求 并且 想要验证请求完成时是否显示成功
  • Android:在列表视图周围绘制自定义边框?

    我有一个 ListActivity 其中有一个 ListView 我需要在边框周围绘制一个重复图像 在它的顶部 我猜是在渲染列表视图之后 我如何为此挂钩自己的绘图代码 您可以使用 FrameLayout 使 ListView 与填充整个屏幕
  • json 显示 mysql 结果的重复输出

    我正在尝试打印 json encode 并且输出重复 我确信数据库中有一条记录 但它以不同的格式两次显示相同的记录数据 就是这个 0 Polo name Polo 1 City location City 2 Manama city Man
  • Devise 在更改密码后注销用户

    我正在使用设备 当用户更改密码时 网站会将其注销 我在网上读到添加sign in可以解决问题 但不起作用 并且当密码更改时用户会被注销 这是我的代码 if user errors base empty and user update att
  • 如何在.NET 6 上的程序文件中使用启动类?

    我正在开发 ASP NET Core 2 2 Web 应用程序 将我的应用程序升级到 NET 6 时遇到一些问题 我的问题是没有startup NET 6 0 中的类 我发现program cs仅文件 我在网络应用程序中添加了启动类 但我不
  • 如何更改根视图控制器

    I want to change the rootViewController after the authenticationViewController IBAction LoginButtonPushed id sender if V
  • 在 SQLite 中启用外键约束

    我将 SQLite 与 C 结合使用 并定义了一些定义了外键的表 现在 我知道默认情况下 SQLite 中不强制执行外键约束 但我想将它们打开 是否可以通过代码来做到这一点 我查了相关的question https stackoverflo
  • Rust 中可以使用全局变量吗?

    我知道一般来说 应该避免使用全局变量 尽管如此 我认为从实际意义上来说 有时需要使用它们 在变量是程序不可或缺的情况下 为了学习 Rust 我目前正在使用 sqlite3 和 GitHub 上的 Rust sqlite3 包编写一个数据库测