我正在尝试新的Dart FFI来为libsodium制作 Package 器。需要通过调用init()来初始化Libsodium。但是我不认为用户应该有负担来记住这一点,我也不想检查一些全局状态变量。我知道Go语言有init()包函数,当一个包被包含进来的时候就会运行。Dart中有类似的东西吗?当然,我可以把所有东西都打包成一个类,然后在构造函数中运行init(),但是初始化一个基本上只公开静态方法的类没有多大意义,此外,我希望保留libsodium的过程化风格。
init()
nwlls2ji1#
当然,我可以把所有东西都打包成一个类,然后在构造函数中运行init(),但是初始化一个基本上只公开静态方法的类没有多大意义。此外,我希望保留libsodium的过程化风格。您可以有一个单例示例,并将库函数作为示例上的方法公开,还可以提供一个自动进行初始化的公共getter函数。例如,类似于:
Libsodium? _instance; Libsodium get libsodium => _instance ??= Libsodium._(); class Libsodium { Libsodium._() { // Do initialization. } void foo() { // ... } void bar() { // ... } }
然后呼叫者将需要通过以下方式使用它:
import 'libsodium.dart'; libsodium.foo();
这将隐藏类的示例化,与只使用具有名称空间(import 'libsodium.dart' as libsodium)的顶级函数相比,调用者看起来没有任何不同。
import 'libsodium.dart' as libsodium
vjhs03f72#
Dart没有隐式运行代码的方法。在main之前没有代码运行,并且所有在main之后运行的代码都这样做,因为它是直接或间接从main方法调用的。如果您需要初始化某些内容,有许多选项。
main
var _initialState = _init(); int doSomething(arguments) { _initialState; do the something. }
阅读_initialState将确保init在第一次需要时被调用,而不是在那之后。您甚至可以在状态中存储内容以供以后使用。
_initialState
init
2条答案
按热度按时间nwlls2ji1#
当然,我可以把所有东西都打包成一个类,然后在构造函数中运行init(),但是初始化一个基本上只公开静态方法的类没有多大意义。此外,我希望保留libsodium的过程化风格。
您可以有一个单例示例,并将库函数作为示例上的方法公开,还可以提供一个自动进行初始化的公共getter函数。
例如,类似于:
然后呼叫者将需要通过以下方式使用它:
这将隐藏类的示例化,与只使用具有名称空间(
import 'libsodium.dart' as libsodium
)的顶级函数相比,调用者看起来没有任何不同。vjhs03f72#
Dart没有隐式运行代码的方法。在
main
之前没有代码运行,并且所有在main
之后运行的代码都这样做,因为它是直接或间接从main
方法调用的。如果您需要初始化某些内容,有许多选项。
阅读
_initialState
将确保init
在第一次需要时被调用,而不是在那之后。您甚至可以在状态中存储内容以供以后使用。init
。