覆沉

C++的concepts
by renyuneyun, post on Fri 22 June 2018

C++有意使用concepts來改進模板使用中編譯期檢查效果(及生成易讀的報錯信息)。(同時該機制理論上亦可以用在普通的函數上。)

注意:concepts現在似乎並不是C++標準。

在目前的情況下,C++無法對模板參數進行任何限制,一切錯誤均需要由編譯器在具象化模板並處理到相應位置時纔能發現。而在其他一些語言中,可以通過對參數進行一定限制,達到提前發現問題(並且報錯更易檢查)。

  • 比如在Java中,可以對泛型參數進行 extendssuper 限定
  • 比如在Rust中,可以對模板參數所要滿足的trait進行限制

然而C++中完全沒有類似的機制,concepts就是用來解決該問題的方法。在上面兩例中,相比起Java,Rust對trait的使用和C++ concepts更爲相近。

Concepts聲明/定義了該模板參數所應當具有的函數,但又不要求一定是繼承某個類而來。該機制同時保留了靈活度,又使得報錯更可讀。(然而繼續增加編譯器複雜度,說不定導致編譯時間更長。)

Read in 1 mins
Rust學習筆記/基礎
by renyuneyun, post on Thu 14 June 2018

包管理器Cargo的基本使用

Rust官方提供了包管理器Cargo,且Cargo同時負責項目的初始化、構建等功能。建議的做法是使用Cargo初始化項目,然後進行編寫,之後使用Cargo進行構建。故而,這裏簡單介紹如何用Cargo完成這兩項功能。

創建項目

$ cargo new YOUR_DIR --bin

該命令會在當前目錄下生成 YOUR_DIR 這個新目錄,其中包含新項目的“模板”文件(即示例)。之後的命令基本均在該目錄下進行。

注意這裏的 --bin 要求Cargo創建一個二進制/可執行項目; --lib 或留空均會創建庫項目。

YOUR_DIR 目錄下有一個名爲 Cargo.toml 的文件。該文件是項目的(Cargo)配置文件,用來描述項目的依賴關係、控制編譯/構建過程等。

編譯並執行項目

$ cargo run

Rust基本語法

Rust是一門強類型、手動類型的語言,這意味着函數參數需要顯式地聲明參數類型(以及返回值類型)。但Rust支持類型自動推導,在聲明並初始化變量時可以通過類型自動推導而省略變量類型 …

Read in 1 mins
Rust學習筆記/背景
by renyuneyun, post on Sat 09 June 2018

對該教程而言,所謂的“類似編程背景”是指:C、C++ 98、Java 6、Python。Rust的部分概念覆蓋這幾種語言中各自的一部分,大約主要是如下部分(除去“編程”這個概念):

  • C、C++、Java的手動類型
  • C++、Python的自動類型推導
  • C、C++的指針
  • C++中指針和引用的區別
  • C++的const函數( int A::fn() const {}
  • Java、Python的自動內存管理
  • C++、Python的lambda表達式
  • C、C++、Python的高階函數
  • C++、Java、Python的命名空間/包/模塊
  • 與類型/結構體綁定的函數(半“面向對象”)

Read in 1 mins
Rust學習筆記
by renyuneyun, post on Sat 09 June 2018


注意 : 部分章節尚未完工

在糾結了兩三年後,今年我終於下定決心好好學一下Rust。巧的是我還看到了Increasing Rust's Reach 2018,報名然後入選了,正好以此作爲契機寫一篇不一樣的Rust教程。

本文主要目的是描述我學習Rust時的一些(絕大多數)心得和體會。其動機之一是給自己留個易於檢查的筆記,之二是提供一個針對特定程序員的Rust教程。

該筆記適用於我及和我有類似編程背景的人。對該系列而言,所謂的“類似編程背景”主要是指C和OOP,以C、C++、Java、Python爲最佳。

不同編程語言所融合的特性不同,因而造就了不同語言的不同特色,但同時也使得學習一門新語言時不僅要學習語法還要學習自己之前所不知道的那部分特性。作爲一門編程語言,Rust中的許多特性和其他許多語言很類似,或乾脆就是一樣。因而,下文在介紹Rust時,如果是所遇到特性是編程背景中已知的部分,將會直接指向該背景特性而不加過多解釋;遇到類似概念,會給出不同之處;遇到新概念則當然是較爲詳細解釋。

我爲什麼學習Rust

同絕大多數語言一樣,Rust是一門命令式語言;同絕大多數“現代”語言一樣,Rust具有命名空間機制;由於目標是系統編程語言,Rust是一門編譯型語言(但較爲強調編譯速度)。

在Rust的所有特點中,我比較在意的幾個(核心 …