互聯社交網絡是除了互聯即時通信系統/IM以外的另一主要互聯系統類型。從來沒有接觸過這類系統的人可以類比互聯的效果爲:直接在新浪微博關注騰訊微博的人(而不需要去騰訊微博重新註冊賬號)。

之前在跟人介紹時,我發現有人會將互聯系統和SSO的效果搞混。事實上,兩者完全不同。仍然以上面在新浪微博S關注騰訊微博T爲例:SSO的本質仍然是在T上註冊了一個新賬戶,然後使用T上的賬戶去關注T上的另一個賬戶,而你的S賬戶上仍然是沒有對T上的關注;但互聯SNS的效果是你直接在S上關注T上的人,不需要在T上重新生成一個賬戶。如果仍然不理解,那請思考在你不登錄T時,即使你做過了“關注”,在你的S賬戶能否看到T上被你關注的人的消息。

幾大比較知名的互聯SNS系統爲:

既然叫互聯系統,每個互聯SNS之內各個不同實例/服務器間的用戶可以互操作。事實上,這些系統主要分爲兩種協議(以及HubZilla的Zot),每個協議內不同系統也可互操作。

下文將以協議爲主要線索串聯不同互聯SNS系統特點與分別、大概歷史、以及我個人對其看法。其中內容來自我對不同互聯SNS系統的瞭解(包括使用),以及背景閱讀(尤其是下文中將會經常引用其圖片的這篇文章)。

The Federation與The Fediverse

(來自https://medium.com …

Rust中可允許自定義的類型僅有兩種: 結構體枚舉 。其中枚舉用於特定場景,而結構體被設計用來支持廣泛場景。

Rust的結構體不支持繼承,所以雖然struct和trait的組合看起來像但其實不是通常意義(C++/Java)上的面向對象實踐。不過trait支持默認方法,可以部分填補該差別。

聲明結構體

基本的結構體聲明和C語言很類似:

struct Point {
    x: i32,
    y: i32,
}

值得一提的是,Rust的結構體的可變性是一個整體,也就是說無法對某一個域單獨聲明可變性。

若結構體某成員是引用,其壽元需要在聲明結構體時一起聲明:

struct Product<'a> {
    value: i32,
    price: i32,
    name: &'a String,
}

結構體也支持泛型:

struct Point<T> {
    a: T,
    b: T,
}

構造一個結構體的語法也很直觀:

Point { x: 0, y: 0 …

壽元是Rust因對堆棧的抽象及保證內存安全而生的(所有權外的)另一概念。

基本而言,壽元代表的是值的有效範圍。許多語言(如C++)中的作用域即是壽元的一個方面,但Rust中的壽元是一更通用/抽象且明確要求的概念。

我見到不少中文Rust相關材料中將lifetime翻譯爲「生命週期」,實在是令人瞠目結舌:「生命週期」是對lifecycle的翻譯,而這些人似乎完全沒有看到Rust中這個概念是lifetime

當然,完全存在另一種可能:他們看到了,仍然將其翻譯爲「生命週期」。這樣則是體現了當代中文翻譯中的一大問題:墨守成規和懶惰——固守已有的「詞」,寧可用錯也不願意另外造詞。當然這也是環境造就的,畢竟中文本以字爲基礎,但一則現在的教育讓人們習慣以詞(字組)爲基礎,二則現在通行的漢字數字化方案對新造漢字很不友好

「壽元」未必是最優的翻譯,但卻是我現下能想到的最信達雅的翻譯。如果有達成共識的不更差的翻譯,我個人很願意遷移。

Rust中,對壽元的需求存在於引用(借用)之上——只有引用的值纔會有值的壽元不同於變量壽元的情況 …

在今年Increase Rust's Reach中,我參與Rust新網站的i18n及l10n。其中新網站要基於 Rocket 構建,所以也就(跟着 官方教程 )學習了一下Rocket。 既然學了,就順便記錄一點心得和體會,以方便後來者。

Rocket是一個 web框架 。我個人對web編程(尤前端)並不太感興趣(主要是感到 web技術棧 太過麻煩/複雜),所以涉及不太多,之前也只用過Python那邊的Flask以及(一小段時間)Django以及Go自帶的http服務器,故而本文不怎麼會涉及和其他web框架的對比。

本文不打算成爲通常意義上的Rocket教程,而只是打算給有興趣者一個快速的(對rocket的)觀感。其中也會有一些個人的經驗教訓等。

Rocket概覽

類似我之前用過的框架,Rocket也將函數作爲不同的路由的處理器。Rocket在每個函數之前使用形如 #[get("/myroute")]屬性 作爲標記,之後在Rocket入口對象/結構體上對所需要的路由(函數)進行 mount 即可。

#[get("/")]
fn …

Rust的一大特色(甚至在官方教程中 被稱爲the most unique feature )就是其借用及所有權機制。這兩個機制由編譯器進行強制,並且可以極大限度地保證變量安全(並行安全)。

所有權

前面說過,同C/C++一樣,Rust中區分堆和棧(但不直接提及)。C/C++中語義上禁止從函數中返回指向局部變量的指針,是因爲當離開函數時,棧會被回收,所以局部變量也會被回收,導致指針失效。

在C/C++中,該禁止並非語法上的禁止。而在Rust中,所有權機制將該概念顯式表達,編譯器會拒絕編譯不滿足所有權機制的代碼。並且Rust設計者們希望通過所有權機制讓程序員不需要考慮堆棧,只需要考慮所有權即可(應當是出於一致性以及或許對未來自動優化的考量?)。

Rust中的 壽元 機制也涉及堆棧的區別。 兩者共同使得Rust不需要GC也可以保證內存安全。

所有權機制實際上就是三條規則:

  • 每個值具有唯一的所有者變量

  • 在同一時刻,所有者唯一

  • 所有者離開作用域時,值會被丟棄

    或者說(我個人的記法):每個值在每個時刻只有唯一的所有者,且有效性跟隨所有者。

所有權本身不涉及特殊語法,只要記住上面三條規則即可 …

理所當然地,Rust提供了條件、循環等控制流程。由於enum的特殊點(可以承載數據),Rust的條件結構爲其有專門的設計,所以也在此簡單介紹enum。

但壽元、所有權、引用借用等概念也影響enum的實際使用,故而會在Rust學習筆記/再敘enum和模式匹配再次討論。

條件結構

if 表達式

if 後接一個 bool 類型的表達式(不需要括號),且 ifelse 子句(均爲表達式)均需要大括號。特殊地,如要書寫 else-if ,則 else if 合併爲一個表達式。

...
let m = if a < 5 {
  println!("a小於5");
  4
} else if a < 8 {
  println!("a小於8 …

Rust提供元組和數組兩種複合數據類型。

元組

元組可將一系列數據(不需要是相同類型)“綁”在一起,以方便後續處理。

fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);

    let (x, y, z) = tup;

    println!("The value of y is: {}", y);

    let five_hundred = tup.0;

    let six_point_four = tup.1;

    let one = tup.2;
}

(抄自 官方教程元組部分

  • 使用 () 將多個數據合在一起組成元組
  • 元組的類型依賴於其各組成元素的數據類型
  • 解包操作可以一次性將元組中所有元素賦予某個值
  • 使用 .N …

類似於絕大多數語言,Rust核心部分提供的數據類型包含整型、實型(浮點數)等常規類型,同時也提供字符串類型。

標量/單量類型

整數與浮點數

i8 是8位(有符號)整型, i32 是32位整型; u32 是32位無符號整型; f32 是32位實型(浮點數)。 其具體大小均包括8、16、32、64這四種。 額外地,對於整數,另有 isizeusize 兩種,代表“取決於機器的大小”。

對於整數,Rust也支持許多其他“單位”的轉換:二進制、八進制、十六進制、以_分段的十進制。 額外地,對於 u8 ,Rust支持直接賦予ASCII對應值(如 b'A' )。例子及更多解釋見 官方教程整數類型部分

算數運算符和其他C家族的一致 …