專案 | 實現前 | 實現後 |
---|---|---|
程式碼組織方式 | 模組/包 二級結構 | 包/子包 樹形結構 沒有父包的包稱為 root 包,root 包及其子包(包括子包的子包)構成的整棵樹稱為 module |
編譯單元 | 包 | 包(每個子包單獨編譯) |
訪問修飾符 | public: 可修飾頂層和非頂層成員,包內外可見 default(不寫):僅本包內可見 protected:只能修飾 class 的成員,本包內可見、本 class 及其子類可見 private:不能修飾 top-level 成員、僅當前作用域可見 |
以下所有訪問修飾符均可修飾頂層和非頂層成員 public:本 module 內外可見 protected:本 module 和子型別內可見 internal:本包及其子樹可見 private:修飾頂層宣告時僅本檔案內可見,修飾非頂層宣告時僅當前型別或擴充套件定義內可見 |
package 訪問修飾符 | 無 | package a.b(= public package a.b) protected package a.b internal package a.b |
import 訪問修飾符 | public import import |
public import protected import internal import import(= private import) |
從 module 匯入的語法 | from std import time.* | 不再有 from 語法,只有 import std.time.* 的語法 |
多匯入的語法 | from std import time.*, math.* import a.*, b.* |
import std.{time.*, math.*} import |
匯入的語義 | from std import time.Duration 可以同時看到 time 和 Duration 這兩個符號 |
import std.time.Duration 只看能看到 Duration 這一個符號 |
單匯入 | 可以匯入頂層宣告,不可以匯入包名 from std import time // error from std import time.Duration // OK |
可以匯入頂層宣告、也可以匯入包名 import std.time // ok import std.time.Duration // OK |
別名匯入 | from std import time.* as stdTime.* // OK from std import time.Duration as stdDuration // OK |
import std.time.* as stdTime.* // error import std.time.Duration as stdDuration // OK |
別名匯入的作用域 | 和當前包頂層宣告處於同一作用域 from std import time.Duration as stdDuration let stdDuration = 1 // error: redefinition |
和當前包頂層宣告處於不同作用域,且優先順序更低,若 shadow 則告警 import std.time.Duration as stdDuration // warning: shadow let stdDuration = 1 // OK |
重複匯入並取別名 | 使用 import as 對匯入的宣告重新命名後,當前包內只能使用別名,無法使用原名 from std import time.Duration // error: time.Duration is renamed from std import time.Duration as stdDuration |
允許使用多條匯入語句分別匯入原名和重新命名 import std.time.Duration import std.time.Duration as Duration1 import std.time.Duration as Duration2 let _ = Duration.second // OK let _ = Duration1.second // OK let _ = Duration2.second // OK |
package hello
import std.random.*//from xxx import bbb -> import xxx.bbb
import std.math.*
main(): Int64 {
const N = 1000000
var n: UInt32 = 0
let random = Random()
for (_ in 0..N) {
let x = random.nextFloat64()
let y = random.nextFloat64()
if ((x - 0.5) ** 2 + (y - 0.5) ** 2 < 0.25) {
n += 1
}
}
let pi = Float64(n) / Float64(N) * 4.0
println('pi = ${pi}')
println('deviation = ${abs(Float64.PI - pi)}')
println("hello world")
return 0
}