クラスの外部から静的メンバ変数を定義するには「クラス名+”::”+静的メンバ変数名」という名前のグローバル変数を定義する。
static data: &str = "this is static variable";
fn func1(){
println!("func1: {:?}", data);
}
fn func2(){
println!("func2: {:?}", data);
}
fn main(){
func1();
func2();
println!("main: {:?}", data);
}
$ ./main
func1: “this is static variable”
func2: “this is static variable”
main: “this is static variable”
staticな変数を宣言することはできるが、mutableにできない。
### once_cell
once_cellを使用すると、mutableなstaticを作成できる。
use once_cell::sync::Lazy;
use std::sync::Mutex;
static ARRAY: Lazy<Mutex<Vec<u8>>> = Lazy::new(|| Mutex::new(vec![]));
fn do_a_call(){
ARRAY.lock().unwrap().push(1);
}
fn main() {
do_a_call();
do_a_call();
do_a_call();
println!("called {}", ARRAY.lock().unwrap().len());
}
vectorの型をu8ではなく構造体にして、一定数以上になったら関数を実行するように編集する
use once_cell::sync::Lazy;
use std::sync::Mutex;
struct Transaction {
x: String,
y: String,
z: u32,
}
static Pool: Lazy<Mutex<Vec<Transaction>>> = Lazy::new(|| Mutex::new(vec![]));
fn make_block (){
println!("blockを作成しました。");
Pool.lock().unwrap().clear();
}
fn do_a_call(){
let t = Transaction { x: "A".to_string(), y: "B".to_string(), z: 10};
if Pool.lock().unwrap().len() > 4 {
make_block();
}
Pool.lock().unwrap().push(t);
}
fn main() {
do_a_call();
do_a_call();
do_a_call();
do_a_call();
do_a_call();
do_a_call();
do_a_call();
println!("called {}", Pool.lock().unwrap().len());
}
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s
Running `target/debug/my_web_app`
blockを作成しました。
called 2
なるほど、やりたいことはできました。これをPostされたトランザクションに対して、トランザクションプールに入れるように実装します。
static Pool: Lazy<Mutex<Vec<SignedTransaction>>> = Lazy::new(|| Mutex::new(vec![]));
fn make_block (){
println!("blockを作成しました。");
Pool.lock().unwrap().clear();
}
#[post("/handshake")]
async fn handshake(req_body: String)-> impl Responder {
let req : SignedTransaction = serde_json::from_str(&req_body).unwrap();
Pool.lock().unwrap().push(req.clone());
if Pool.lock().unwrap().len() > 1 {
make_block();
}
println!("{}", req.signature);
HttpResponse::Ok().body(req_body)
}
Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.94s
Running `target/debug/hoge`
8000E340A55A517D0F27F3A63FBE39ED576BA491DFAC89B44654AB147EC66B206B054BAAF53E318EB2721DC892B4736630F400547989AE9F7C069034ECB4DF98
blockを作成しました。
8000E340A55A517D
おおおおおおお、イイネ!