gpt4 book ai didi

crystal-lang - 首次访问时初始化

转载 作者:行者123 更新时间:2023-12-01 13:28:04 26 4
gpt4 key购买 nike

我有以下访问器方法:

def self.database : DB::Database
if @@database.nil?
config = Utils.config["database"].as(Hash)
connection = [
"postgres://#{config["user"]}:#{config["password"]}",
"@localhost/stats",
].join

@@database = DB.open connection
else
@@database
end
end

保证返回 DB::Database .我不确定如何声明类变量:
class Daemon
@@database

def self.database : DB::Database
end
end

编译器向我提供了一些选项,但大多数选项不会产生编译的建议:
  • @@database = uninitialized DB::Database编译,但不通过 nil?测试讨论 in this GitHub issue .
  • 我无法实例化占位符 DB::Database容易地。
  • 我也不确定如何使用访问函数 self.database 进行初始化,尽管这会起作用并提供类型保证。

  • 怎样才能正确初始化类变量?任何帮助将不胜感激!

    此解决方案有效:
    class Daemon
    @@database = uninitialized DB::Database

    def self.database : DB::Database
    config = Utils.config["database"].as(Hash)
    connection = [
    "postgres://#{config["user"]}:#{config["password"]}",
    "@localhost/stats",
    ].join

    DB.open connection
    end

    以这种方式编写类评估器的唯一问题是我会开始泄漏文件描述符——每次我访问 @@database ,我打开一个到数据库的新连接。我要初始化 @@database仅在第一次访问期间,并找出一种使编译器满意的方法,从 uninitialized 开始.

    更烦人的:
    class Daemon
    @@database = uninitialized DB::Database
    @@database_init = false

    def self.database : DB::Database
    if !@@database_init
    config = Utils.config["database"].as(Hash)
    connection = [
    "postgres://#{config["user"]}:#{config["password"]}",
    "@localhost/stats",
    ].join

    @@database = DB.open connection
    @@database_init = true
    end

    @@database
    end
    end

    最佳答案

    您可以使类 var 可空并有条件地在类方法中分配一个值:

    class Daemon
    @@database : DB::Database?

    def self.database
    @@database ||= begin
    config = Utils.config["database"].as(Hash)
    connection = [
    "postgres://#{config["user"]}:#{config["password"]}",
    "@localhost/stats",
    ].join

    DB.open connection
    end
    end
    end

    Daemon.database.query "..." # => #<PG::ResultSet:0x103ea2b40 ...>

    关于crystal-lang - 首次访问时初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47466858/

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