您正在閱讀「Rust Taiwan 2020 讀書會筆記」的一節,歡迎點擊本頁上方的 協助編修。
fn main () {
let x = Box::new(5); // x 出生
println!("{:?}", x);
{
let y = Box::new(1); // y 出生
println!("{:?}", y);
} // y 死亡
// cannot find value `y` in this scope
// y 死掉了,所以你存取不到他
println!("{:?}", y);
} // x 死亡
#[allow(unused_variables, unused_assignments)]
fn main () {
let x; // x 出生
{
let y = Box::new(1); // y 出生
x = &y; // x 借用 y 的所有權
println!("{:?}", y);
} // y 死亡
// `y` does not live long enough
// y 死掉了,所以 x 存取不到他 (1編譯器:可憐的 y 他活的不夠久 owo)
println!("{:?}", x);
} // x 死亡
'
,就是生命周期的標示
fn main () {
test();
}
// 生命周期標示,必須像泛型一樣,在 function 簽名中先被宣告
fn test<'a, 'b> () {
let x: &'a i32 = &5; // 'a 開始
println!("{:?}", x);
{
let y: &'b i32 = &2; // 'b 開始
println!("{:?}", y);
} // 'b 結束
} // 'a 結束
#[derive(Debug)]
struct Person {
age: i32
}
// 因為 傳入值 與 回傳值 只有一個
// 不會造成編譯器需要檢查生命周期的問題
// 所以沒有必要標示生命周期
fn life_again_gun (y: &mut Person) -> &mut Person {
y.age = 0;
y
}
fn main () {
let mut x = Person { age: 16 };
let y = life_again_gun(&mut x);
println!("{:?}", y);
}
#[derive(Debug)]
struct Person {
age: i32
}
// missing lifetime specifier
// 因為編譯器看不出回傳的 借用者 是不是會超過 擁有者 的 lifetime
// 所以要求你編上 lifetime
fn the_older (x: &Person, y: &Person) -> &Person {
if x.age > y.age { x } else { y }
}
fn main () {
}
#[derive(Debug)]
struct Person {
age: i32
}
// 我們預期這裡只會有一種生命周期
fn the_older<'a> (x: &'a Person, y: &'a Person) -> &'a Person {
if x.age > y.age { x } else { y }
}
fn main () {
let x = Person { age: 16 };
let y = Person { age: 17 };
let res = the_older(&x, &y);
println!("{:?}", res)
}
#[derive(Debug)]
struct Person {
age: i32
}
// 我們有兩個生命周期 'a 與 'b,其中 'b 活的比 'a 久
fn the_older<'a, 'b: 'a> (x: &'a Person, y: &'b Person) -> &'a Person {
if x.age > y.age { x } else { y }
}
fn main () {
let x = Person { age: 16 };
let res;
{
let y = Person { age: 17 };
res = the_older(&x, &y);
println!("{:?}", res);
}
}
#[derive(Debug)]
struct Person {
age: i32
}
fn birthday (y: &mut Person) {
y.age = y.age + 1;
}
fn life_again_gun (y: &mut Person) -> &mut Person {
y.age = 0;
y
}
fn main () {
let mut x = Person { age: 16 };
let y = life_again_gun(&mut x);
// 在 Lexical-Lifetime 的情況,y 的生命周期沒有結束
// 所以 y 還在進行可變借用
// 那理論上 x 就不可以再度可變出借
// (NLL 好像已經是標準了,所以我無法實現 LL 的編譯錯誤)
birthday(&mut x);
println!("{:?}", x);
}
#[derive(Debug)]
struct Person {
age: i32
}
fn birthday (y: &mut Person) {
y.age = y.age + 1;
}
fn life_again_gun (y: &mut Person) -> &mut Person {
y.age = 0;
y
}
fn main () {
let mut x = Person { age: 16 };
let y = life_again_gun(&mut x);
// 在 Non-Lexical-Lifetime 的情況
// y 在這段程式碼的後面都沒有被使用到
// y 的生命周期就結束了
// 那這裡就不會有問題
birthday(&mut x);
println!("{:?}", x);
}
#[derive(Debug)]
struct Person {
age: i32
}
fn birthday (y: &mut Person) {
y.age = y.age + 1;
}
fn life_again_gun (y: &mut Person) -> &mut Person {
y.age = 0;
y
}
fn main () {
let mut x = Person { age: 16 };
let y = life_again_gun(&mut x);
// cannot borrow `x` as mutable more than once at a time
// 但如果 y 在後面有機會被使用到
// 就代表 y 的生命周期還沒有結束
// 所以 x 不可以再度進行可變出借
birthday(&mut x);
y.age = 16;
println!("{:?}", x);
}
早安,這是一個關於 Kubernetes 的文章,如果你不知道 Kubernetes 是什麼,建議先去看一下官方文件,另外本文會搭配 GKE 使用。 方法一 什麼都不管,雜成一鍋粥 說明:把所有的 pod 都放在同一個 node 或 node pool 裡,自動擴展開起來,方便又省事 優點:方便快速,菜雞工程師都這麼幹 缺點:混亂 方法二 指定 node pool (指定 node) 說明:如果用的不是 GKE,可能沒有 node pool,如果是拿一般機器建,可能是直接指定 node GKE 直接指定 node 的風險很高,因為 GKE 很常莫名回收掉你的機器,建議指定 node pool
May 5, 2023:::success 你現在在閱讀的是 書摘 的其中一節 ::: [TOC] 前言 人都有損失規避的行為,所以我們會用掉被分配的特休假天數,可是當你沒有規定特休假天數,反而也比較不傾向休假
Aug 21, 2021:::success 你現在在閱讀的是 書摘 的其中一節 ::: 楔子 精準策略:彼得杜拉克8大管理DNA 專注力協定:史丹佛教授教你消除逃避心理,自然而然變專注。 零規則:高人才密度x完全透明x最低管控,首度完整直擊Netflix圈粉全球的關鍵祕密
Aug 21, 2021:::success 你現在在閱讀的是 書摘 的其中一節 ::: [TOC] 實踐 目標是讓自己的行事曆上完全沒有空白,這樣就會有一個讓你知道該如何使用時間的模板 一旦排定了事情,就要執行
Aug 21, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up