覽到實(shí)戰(zhàn)要點(diǎn))
文檔教程【免費(fèi)下載鏈接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!項(xiàng)目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs點(diǎn)擊查看免費(fèi)下載本文以本倉庫根目錄下的 cangjie.md 為核心骨架完整解讀這份Learn X in Y minutes風(fēng)格的倉頡Cangjie語言導(dǎo)覽。倉頡是一門靜態(tài)類型的通用編程語言表層語法接近 C 系語言同時提供類型推斷、表達(dá)式化控制流、代數(shù)枚舉、模式匹配、類、接口、泛型、屬性、函數(shù)值與操作符重載等現(xiàn)代語言特性。讀完本文你將掌握用cjc編譯單文件、用cjpm組織工程的完整流程并逐一理解倉頡在變量、控制流、集合、函數(shù)、面向?qū)ο笈c模式匹配方面的核心寫法能夠在真實(shí)工程中快速上手。文檔定位一份可運(yùn)行的代碼即教程本倉庫 README.md 明確說明這里的每一篇文檔都是以有效、帶注釋的代碼呈現(xiàn)的旋風(fēng)式語言導(dǎo)覽Whirlwind tours presented as valid, commented code and explained as they go。這與本倉庫其他語言文檔如根目錄下的 python.md、rust.md的體例完全一致文檔本身就是一份可以編譯運(yùn)行的示例程序邊運(yùn)行邊講解。倉庫還提供了該文檔的中文翻譯版本 zh-cn/cangjie.md兩版內(nèi)容一一對應(yīng)便于對照學(xué)習(xí)。同時倉庫在 lint/frontmatter.py 中實(shí)現(xiàn)了對每篇文檔 YAML 前置元數(shù)據(jù)name、filename、contributors、translators等鍵的自動化校驗(yàn)這從工程層面保證了文檔結(jié)構(gòu)的規(guī)范性——讀者在閱讀任何一篇導(dǎo)覽時都可以依賴其前置元數(shù)據(jù)快速定位貢獻(xiàn)者與文件名??焖偕鲜謴膯挝募幾g到工程管理倉頡源文件以**包聲明package declaration**開始導(dǎo)入語句緊跟其后。示例開篇給出了最小的可運(yùn)行骨架// Source files begin with a package declaration. package learnxinyminutes // Imports come after the package declaration. import std.convert.* import std.math.* import std.random.* // With the Cangjie SDK, a single file can be compiled with: // cjc learncangjie.cj // Larger projects normally use cjpm and a cjpm.toml manifest. // Single-line comments start with two slashes. /* Multi-line comments look like this. */這里透露出兩個關(guān)鍵的工程事實(shí)單文件場景安裝倉頡 SDK 后直接執(zhí)行cjc learncangjie.cj即可編譯單個源文件大型工程場景較大項(xiàng)目通常使用cjpm包管理工具并配合cjpm.toml清單文件組織依賴與構(gòu)建配置。注釋方面單行注釋以兩個斜杠//開頭多行注釋使用/* ... */與 C 系語言保持一致。導(dǎo)入使用通配符形式如import std.convert.*一次性引入標(biāo)準(zhǔn)庫某個包下的全部成員這與后文標(biāo)準(zhǔn)庫初探一節(jié)中的std.math、std.random、std.convert三個包形成呼應(yīng)——它們正是這份導(dǎo)覽運(yùn)行時所依賴的核心標(biāo)準(zhǔn)庫模塊。程序入口、輸出、輸入與變量創(chuàng)建與 C 語言類似main是倉頡可執(zhí)行程序的入口其返回類型為Int64// main is the entry point of an executable program. main(): Int64 { // println writes a line to standard output. println(Hello, Cangjie!) // print writes without appending a newline. print(This prompt stays on the same line: ) println(done) // readln() reads one line from standard input as a String. // Keep this commented so the tour can run without waiting for input. // let rawInput readln() // let parsedNumber Int64.parse(rawInput) // Create an immutable binding with let. let language: String Cangjie // Create a mutable variable with var. var releaseYear: Int64 2024 releaseYear 1 // Type annotations are often optional for local variables. let inferredInt 42 let inferredFloat 3.14159 println(${language} ${releaseYear}) println(${inferredInt}, ${inferredFloat}) learnBindings() learnStringsAndNumbers() learnControlFlow() learnCollections() learnFunctions() learnStructsClassesAndInterfaces() learnEnumsAndOptions() learnStandardLibrary() return 0 }這一節(jié)濃縮了倉頡最基礎(chǔ)、也最日常的語法要素標(biāo)準(zhǔn)輸出println輸出一行并換行print輸出但不追加換行標(biāo)準(zhǔn)輸入readln()從標(biāo)準(zhǔn)輸入讀取一整行并返回String若要做數(shù)值處理需先調(diào)用Int64.parse(rawInput)進(jìn)行解析示例中特意保持注釋狀態(tài)避免導(dǎo)覽程序運(yùn)行時阻塞等待輸入綁定語義let創(chuàng)建不可變綁定immutable bindingvar創(chuàng)建可變變量mutable variablereleaseYear 1驗(yàn)證了var的可變性類型推斷局部變量的類型標(biāo)注通??梢允÷詌et inferredInt 42會自動推斷為Int64let inferredFloat 3.14159會自動推斷為浮點(diǎn)類型字符串插值${language} ${releaseYear}使用${...}語法嵌入表達(dá)式。main依次調(diào)用八個learn*函數(shù)這既是導(dǎo)覽的目錄結(jié)構(gòu)也給出了推薦的學(xué)習(xí)順序綁定與基本類型 → 字符串與數(shù)字 → 控制流 → 集合 → 函數(shù) → 結(jié)構(gòu)體/類/接口 → 枚舉與 Option → 標(biāo)準(zhǔn)庫。貫穿全篇的預(yù)備聲明一個迷你類型系統(tǒng)在進(jìn)入各專題之前導(dǎo)覽先集中聲明了一批后續(xù)各節(jié)都會用到的類型。這些聲明本身就是倉頡類型系統(tǒng)的一次總預(yù)習(xí)——結(jié)構(gòu)體、接口、類、泛型、枚舉、泛型函數(shù)、函數(shù)重載在這里全部亮相// Cangjie has struct for value-like records. struct Vec2 { // A primary constructor can declare fields directly. public Vec2(var x: Float64, var y: Float64) {} public func length(): Float64 { sqrt(x * x y * y) } // mut marks a struct method that changes the receiver. public mut func scale(k: Float64): Unit { x * k y * k } // Operators are functions too. public operator func (rhs: Vec2): Vec2 { Vec2(x rhs.x, y rhs.y) } public func toString(): String { (${x.format(.1)}, ${y.format(.1)}) } } // Interfaces describe behavior. Implementing types use :. interface Named { prop label: String } // Classes are reference types and can carry fields, constructors, properties, // instance methods, static methods, and operator functions. class Person : Named { let id: Int64 private let rawName: String public init(id: Int64, name: String) { this.id id this.rawName name } // Properties use get and, for mutable properties, set. public prop label: String { get() { ${id}:${rawName} } } public func greet(): Unit { println(Hello, I am ${rawName}.) } } // A compact class constructor can declare fields in the parameter list. class BoxT { public Box(var value: T) {} public func mapR(f: (T) - R): BoxR { BoxR(f(value)) } } class Directory { private let people: ArrayPerson public init(people: ArrayPerson) { this.people people } // Overload [] to make a small lookup type. public operator func [](id: Int64): ?Person { for (person in people) { if (person.id id) { return Some(person) } } return None } } // Enums are algebraic data types. Constructors can hold data. enum Command { Quit | Echo(String) | Move(Vec2) | Repeat(Int64, String) } // OptionT is an enum with Some(T) and None. // ?T is shorthand for OptionT. func firstT(items: ArrayT): ?T { if (items.size 0) { return None } return Some(items[0]) } func run(command: Command): Unit { match (command) { case Quit println(quit) case Echo(text) println(text) case Move(delta) println(move by ${delta.toString()}) case Repeat(times, text) for (_ in 0..times) { println(text) } } } func printNamedT(item: T): Unit where T : Named { println(item.label) } // Overload functions by parameter types. func twice(x: Int64): Int64 { x * 2 } func twice(x: Float64): Float64 { x * 2.0 }這段預(yù)備聲明值得逐條拆解因?yàn)樗鼛缀醺采w了倉頡類型系統(tǒng)的全部核心概念struct與值語義Vec2是值類型的記錄value-like record。其主構(gòu)造函數(shù)primary constructor直接在參數(shù)列表中聲明字段var x: Float64, var y: Float64mut關(guān)鍵字標(biāo)記會修改接收者receiver的方法scale因此可以原地改寫x、y操作符在倉頡中同樣以函數(shù)形式聲明operator func 重載了加法運(yùn)算toString配合format(.1)輸出格式化后的坐標(biāo)。interface與實(shí)現(xiàn)約束Named接口聲明了一個屬性prop label: String。實(shí)現(xiàn)接口使用:符號class Person : Named而不是其他語言常見的implements關(guān)鍵字。class與引用語義Person是引用類型擁有字段、構(gòu)造函數(shù)、屬性與實(shí)例方法。屬性使用get可變屬性再加set定義讀寫邏輯label屬性在讀取時動態(tài)拼出${id}:${rawName}字符串。字段可用private修飾實(shí)現(xiàn)封裝。泛型類BoxT演示了緊湊的類構(gòu)造函數(shù)——在參數(shù)列表中直接聲明字段var value: T泛型方法mapR接收一個函數(shù)值f: (T) - R把BoxT變換為BoxR。操作符重載實(shí)現(xiàn)索引訪問Directory重載[]操作符使directory[id]可以按編號查找Person返回類型為?Person即OptionPerson未找到時返回None——用類型系統(tǒng)顯式表達(dá)可能不存在。代數(shù)數(shù)據(jù)類型enum Command的構(gòu)造子可以攜帶數(shù)據(jù)Echo(String)、Move(Vec2)、Repeat(Int64, String)各自攜帶不同形態(tài)的載荷。OptionT與?TfirstT返回?T空數(shù)組返回None否則返回Some(items[0])完全繞開了空指針問題。模式匹配run用match對Command的四種形態(tài)逐一解構(gòu)case Repeat(times, text)還能同時解出載荷中的兩個值。泛型約束與函數(shù)重載printNamedT用where T : Named約束類型參數(shù)必須實(shí)現(xiàn)Named接口twice則以參數(shù)類型區(qū)分兩個同名函數(shù)重載。由于這些聲明會在后文各節(jié)被反復(fù)調(diào)用建議讀者先通讀一遍、不必強(qiáng)記細(xì)節(jié)等后續(xù)章節(jié)真正用到時再回頭對照。綁定與基本類型顯式轉(zhuǎn)換與字面量進(jìn)制learnBindings展示了倉頡的常用基本類型與字面量寫法func learnBindings(): Unit { // Common primitive types. let ok: Bool true let signed: Int64 -42 let unsigned: UInt64 42 let f32: Float32 1.25 let f64: Float64 2.5 println(${ok}, ${signed}, ${unsigned}, ${f32}, ${f64}) // Integer literals support familiar base prefixes. let decimal: Int64 255 let binary: Int64 0b11111111 let octal: Int64 0o377 let hex: Int64 0xFF println(${decimal}, ${binary}, ${octal}, ${hex}) // Numeric conversions are explicit. let count: Int64 3 let price: Float64 19.95 let total Float64(count) * price println(total: ${total.format(.2)}) }要點(diǎn)歸納基本類型覆蓋布爾Bool、有符號整型Int64、無符號整型UInt64、單精度浮點(diǎn)Float32、雙精度浮點(diǎn)Float64進(jìn)制字面量十進(jìn)制直接書寫二進(jìn)制0b前綴、八進(jìn)制0o前綴、十六進(jìn)制0x前綴0b11111111、0o377、0xFF均等于十進(jìn)制的255顯式數(shù)值轉(zhuǎn)換倉頡不允許隱式跨類型數(shù)值轉(zhuǎn)換Int64轉(zhuǎn)Float64必須顯式調(diào)用構(gòu)造形式Float64(count)這正是靜態(tài)類型語言保證精度的典型做法格式化輸出total.format(.2)將浮點(diǎn)數(shù)格式化為保留兩位小數(shù)是貫穿全篇的標(biāo)準(zhǔn)庫format用法。字符串、字符、元組與插值learnStringsAndNumbers聚焦文本處理與組合類型func learnStringsAndNumbers(): Unit { let name Ada let score 99.5 // String interpolation uses ${...}. println(${name} scored ${score.format(.1)}) // readln() reads a String. Parse it before numeric work. // let line readln() // let n Int64.parse(line) let csv red,green,blue let parts csv.split(,) println(parts[0]) // Rune represents a Unicode character. let letter: Rune Rune(UInt32(65)) let lineBreak: Rune Rune(UInt32(10)) let generated: Rune Rune(UInt32(65)) println(${letter}${lineBreak}${generated}) // Tuples group a fixed number of values. let pair: (String, Int64) (answer, 42) let (word, value) pair println(${word}: ${value}) }關(guān)鍵點(diǎn)插值即表達(dá)式${name} scored ${score.format(.1)}表明${...}中可以直接書寫帶方法調(diào)用的表達(dá)式而非僅限簡單變量輸入解析readln()返回String數(shù)值計(jì)算前必須顯式Int64.parse(line)字符串分割csv.split(,)返回分割后的數(shù)組parts[0]取下標(biāo)為 0 的元素Rune字符類型Rune表示一個 Unicode 字符由UInt32碼點(diǎn)構(gòu)造Rune(UInt32(65))即字符A元組與解構(gòu)元組(String, Int64)將固定數(shù)量的值組合在一起let (word, value) pair一次性解構(gòu)出兩個綁定。表達(dá)式化控制流if 是表達(dá)式區(qū)間左閉右開倉頡的控制流整體是**面向表達(dá)式expression-oriented**的這是它區(qū)別于普通 C 系語言的核心體驗(yàn)之一func learnControlFlow(): Unit { let temperature 22.5 // if can be used for branching. if (temperature 30.0) { println(hot) } else if (temperature 10.0) { println(cold) } else { println(comfortable) } // if can also produce a value. let status if (temperature 18.0) { open } else { closed } println(status) // a..b is left-closed and right-open. for (i in 0..3) { print(${i} ) } println() // a..b includes both ends. var sum: Int64 0 for (i in 1..100) { sum i } println(sum) var x: Int64 4 while (x 0) { x - 1 } // do-while runs its body at least once. do { x 1 } while (x 2) while (true) { if (x 2) { continue } break } }逐項(xiàng)解讀if的雙重身份既能作為語句進(jìn)行分支也能作為表達(dá)式產(chǎn)出值——let status if (...) { open } else { closed }直接把分支結(jié)果綁定給變量無需三元運(yùn)算符區(qū)間語法a..b左閉右開0..3遍歷 0、1、2a..b兩端都包含1..100求和即 5050循環(huán)家族for ... in遍歷區(qū)間或集合while先判斷后執(zhí)行do-while至少執(zhí)行一次循環(huán)體continue/break在while (true)中配合條件跳出或提前進(jìn)入下一輪迭代語義與其他語言一致。數(shù)組與集合字面量推斷與重復(fù)初始化learnCollections演示了數(shù)組Array的兩類創(chuàng)建方式與遍歷func learnCollections(): Unit { // Array literals infer their element type. let primes [2, 3, 5, 7, 11] println(first prime: ${primes[0]}) // Create a fixed-size Array with a repeated initial value. var squares: ArrayInt64 Array(5, repeat: 0) for (i in 0..squares.size) { squares[i] i * i } for (value in squares) { print(${value} ) } println() let maybeFirst first(squares) if (maybeFirst.isSome()) { println(first square: ${maybeFirst.getOrThrow()}) } }要點(diǎn)字面量推斷[2, 3, 5, 7, 11]自動推斷元素類型primes[0]按下標(biāo)取值固定大小 重復(fù)初值A(chǔ)rray(5, repeat: 0)創(chuàng)建長度為 5、初始值全部為 0 的數(shù)組通過squares.size取長度結(jié)合區(qū)間0..squares.size完成按索引寫入值遍歷for (value in squares)直接遍歷元素首次接觸 Option 消費(fèi)端first(squares)返回?Int64用isSome()判斷有值后再以getOrThrow()取出——這是倉頡用類型表達(dá)可能缺失的日常寫法后文枚舉與 Option一節(jié)還會深入。函數(shù)、閉包與重載函數(shù)是一等值learnFunctions系統(tǒng)展示了函數(shù)類型、lambda、閉包與函數(shù)值func learnFunctions(): Unit { // Function types use arrows. var op: (Int64, Int64) - Int64 { a: Int64, b: Int64 a b } println(op(2, 3)) op { a: Int64, b: Int64 a * b } println(op(2, 3)) // Closures can capture local variables. let offset 10 let addOffset: (Int64) - Int64 { n: Int64 n offset } println(addOffset(5)) // Functions are values. let f: (Int64) - Int64 twice println(f(21)) println(twice(21)) println(twice(21.0).format(.1)) let boxed BoxInt64(21) let mapped boxed.map({ n: Int64 value${n} }) println(mapped.value) }核心結(jié)論函數(shù)類型用箭頭(Int64, Int64) - Int64表示接收兩個Int64、返回Int64的函數(shù)類型lambda 寫法為{ a: Int64, b: Int64 a b }左側(cè)是參數(shù)列表、右側(cè)是函數(shù)體變量可重新綁定到不同函數(shù)op先指向加法 lambda再指向乘法 lambda說明函數(shù)類型變量可以重新賦值閉包捕獲lambda{ n: Int64 n offset }捕獲了外層局部變量offset函數(shù)即值命名函數(shù)twice可以直接賦值給函數(shù)類型變量let f: (Int64) - Int64 twice重載按參數(shù)類型分派twice(21)命中Int64版本返回整數(shù)twice(21.0)命中Float64版本返回浮點(diǎn)高階泛型BoxInt64(21).map({ n value${n} })把BoxInt64變換為BoxString印證了預(yù)備聲明中mapR的泛型函數(shù)類型(T) - R。結(jié)構(gòu)體、類、接口、屬性與操作符面向?qū)ο蟮耐暾磮DlearnStructsClassesAndInterfaces是整份導(dǎo)覽中信息密度最高的運(yùn)行示例把預(yù)備聲明里定義的類型全部串了起來func learnStructsClassesAndInterfaces(): Unit { var a Vec2(3.0, 4.0) let b Vec2(1.0, 2.0) let c a b println(a.length().format(.1)) println(c.toString()) a.scale(2.0) println(a.toString()) let ada Person(1, Ada) ada.greet() // Person implements Named, so it can be used by a generic function // constrained with where T : Named. printNamedPerson(ada) let directory Directory([ Person(1, Ada), Person(2, Grace), Person(3, Edsger) ]) // This calls Directory.operator[]. let maybePerson directory[2] if (maybePerson.isSome()) { let person maybePerson.getOrThrow() println(found ${person.label}) } }運(yùn)行效果與設(shè)計(jì)意圖值語義與操作符重載Vec2(3.0, 4.0)與Vec2(1.0, 2.0)通過重載的得到Vec2(4.0, 6.0)a.length()計(jì)算模長 5.0mut方法原地修改a.scale(2.0)因?yàn)閟cale以mut修飾可以原地把a(bǔ)變?yōu)?6.0, 8.0)若在不可變綁定上調(diào)用mut方法會編譯報錯引用類型與多態(tài)Person(1, Ada)是引用類型實(shí)例ada.greet()調(diào)用實(shí)例方法泛型約束的兌現(xiàn)Person實(shí)現(xiàn)了Named接口因此可以傳給受where T : Named約束的printNamedPerson輸出label屬性值1:Ada操作符[]的調(diào)用directory[2]表面是下標(biāo)訪問實(shí)際觸發(fā)Directory.operator[]返回?Person用isSome()/getOrThrow()取出后打印label。枚舉、模式匹配與 Option用類型消滅空指針learnEnumsAndOptions把代數(shù)枚舉、match與Option三種機(jī)制組合使用func learnEnumsAndOptions(): Unit { let commands: ArrayCommand [ Echo(ready), Move(Vec2(5.0, -2.0)), Repeat(2, again), Quit ] for (command in commands) { run(command) } let directory Directory([Person(1, Ada)]) let missing directory[99] match (missing) { case Some(person) println(person.label) case None println(no person with that id) } // if let style conditions are concise for one successful pattern. if (directory[1].isSome()) { let person directory[1].getOrThrow() println(hello ${person.label}) } }理解要點(diǎn)帶數(shù)據(jù)的枚舉Command的四個構(gòu)造子被實(shí)例化后存入數(shù)組——Echo(ready)攜帶字符串、Move(Vec2(5.0, -2.0))攜帶坐標(biāo)、Repeat(2, again)攜帶次數(shù)與文本、Quit不攜帶數(shù)據(jù)窮盡式匹配run(command)中的match對四種形態(tài)逐一給出case分支且能在分支內(nèi)解構(gòu)載荷如case Repeat(times, text)實(shí)現(xiàn)按形態(tài)分發(fā)邏輯Option顯式處理缺失directory[99]找不到人返回Nonematch分別處理Some(person)與None兩個分支編譯器保證兩個分支都被覆蓋if let風(fēng)格的簡寫當(dāng)只關(guān)心一種成功模式時可先用isSome()判斷、再getOrThrow()取值寫出更簡潔的順序式代碼。標(biāo)準(zhǔn)庫初探math、random、convert 三件套導(dǎo)覽結(jié)尾用一小段程序演示標(biāo)準(zhǔn)庫三個包的典型用法func learnStandardLibrary(): Unit { // std.math.* println(sqrt(81.0)) println(abs(-12)) // std.random.* let rng Random() let dice rng.nextInt64(6) 1 println(dice: ${dice}) // std.convert.* let n Int64.parse(123) let y Float64.parse(3.5) println(${n}, ${y.format(.2)}) // Cangjie also has packages for collections, I/O, time, regex, // concurrency, testing, reflection, macros, and C interoperability. }std.mathsqrt(81.0)開平方得 9.0abs(-12)取絕對值std.randomRandom()創(chuàng)建隨機(jī)數(shù)生成器nextInt64(6)生成[0, 6)區(qū)間的隨機(jī)整數(shù)加 1 即得 16 的骰子點(diǎn)數(shù)std.convertInt64.parse(123)、Float64.parse(3.5)將字符串解析為數(shù)值與開篇Int64.parse(rawInput)的處理方式完全一致更廣闊的標(biāo)準(zhǔn)庫版圖導(dǎo)覽同時提示倉頡還提供集合collections、I/O、時間time、正則regex、并發(fā)concurrency、測試testing、反射reflection、宏macros以及 C 互操作C interoperability等包為后續(xù)深入學(xué)習(xí)劃定了地圖??偨Y(jié)倉頡與普通 C 系語言的差異文檔末尾對全篇做了凝練收束指出這份導(dǎo)覽刻意保持緊湊但已經(jīng)足以展示倉頡區(qū)別于普通 C 系語言的五個核心特質(zhì)表達(dá)式都有類型if、循環(huán)等控制結(jié)構(gòu)可以產(chǎn)出值類型系統(tǒng)全程參與Option取代大量類 null場景?T與Some/None讓可能不存在成為類型的一部分配合isSome()/getOrThrow()安全取值枚舉攜帶數(shù)據(jù)代數(shù)數(shù)據(jù)類型把形態(tài)與載荷綁定在一起配合match實(shí)現(xiàn)窮盡式模式匹配接口約束泛型:與where T : Named讓泛型代碼既能抽象又能受檢操作符與屬性是普通聲明operator func 、operator func []、prop的get/set都是語言中的一等聲明而非編譯器魔法。若想繼續(xù)深入可以對照本倉庫的中文版 zh-cn/cangjie.md 逐段精讀并參照 README.md 了解本倉庫代碼即教程的文檔規(guī)范——這份導(dǎo)覽本身就是一份可直接用cjc編譯運(yùn)行的完整程序動手跑一遍比任何講解都更直觀。贊分享文檔教程【免費(fèi)下載鏈接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!項(xiàng)目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs點(diǎn)擊查看免費(fèi)下載相關(guān)推薦大麥搶票自動化完整指南ticket-purchase 從環(huán)境搭建到提交訂單大麥搶票自動化完整指南ticket purchase 從環(huán)境搭建到提交訂單 熱門演出開票即售罄手動刷新加點(diǎn)擊常常慢半拍。大麥自動搶票項(xiàng)目 ticket pu文檔教程CoffeeScript 語法速成指南逐句編譯為 JavaScript 的現(xiàn)代語言入門learnxinyminutes-docs 版CoffeeScript 語法速成指南逐句編譯為 JavaScript 的現(xiàn)代語言入門learnxinyminutes docs 版 CoffeeScri文檔教程Ubuntu 24.04 上 ROCm apt update 報 Release 文件缺失3 步修好Ubuntu 24.04 上 ROCm apt update 報 Release 文件缺失3 步修好 在 Ubuntu 24.04 上跑 apt upda文檔教程上一篇ParadeDB Top-K 升序 BM25 基準(zhǔn)查詢詳解Stack Overflow 數(shù)據(jù)集中等選擇性場景top_k_score_asc_medium_selectivity下一篇PVZ Toolkit 植物大戰(zhàn)僵尸修改器從安裝到進(jìn)階玩法的完整教程創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考