ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Learn X in Y minutes:Dart 语言西班牙语速成教程(learnxinyminutes-docs 仓库解读)

2026/10/6 2:23:19 拓冰建站 浏览量
Learn X in Y minutes:Dart 语言西班牙语速成教程(learnxinyminutes-docs 仓库解读) 文档教程【免费下载链接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载本文以 es/dart.md 为核心蓝本对照英文原版 dart.md为你逐段拆解这份可执行的 15 分钟 Dart 入门教程从函数、类、继承、混入mixin、构造器、泛型到循环、字符串、正则、异常与流控制全部以可直接运行的 Dart 代码呈现。读完后你将掌握 Dart 的核心语法骨架理解可选/静态类型在 Dart 中的定位并学会如何在本地 Dart 运行时或 DartPad 中复现教程中的全部示例。文章同时结合当前仓库的文档组织规范README.md、CONTRIBUTING.md、lint/frontmatter.py说明这类以代码为文档的教程文件是如何被维护、校验与展示的。仓库定位一份以代码写成的文档README.md 第一行即点明了这个仓库的本质Whirlwind tours of (several, hopefully many someday) popular and ought-to-be-more-popular programming languages, presented as valid, commented code and explained as they go.——即把编程语言教程写成合法、带注释、可执行的代码边写边解释。这决定了 es/dart.md 的形态一篇几乎完全由可运行示例example1到example30构成的教程而非长篇大论的文字讲解。每篇文档顶部都有 YAML frontmatter 元数据。例如 es/dart.md 开头声明了contributors: - [Joao Pedrosa, https://github.com/jpedrosa/] translators: - [Jorge Antonio Atempa, http://www.twitter.com/atempa09]contributors原作者Dart 教程由 Joao Pedrosa 撰写translators翻译者西班牙语版由 Jorge Antonio Atempa 翻译。仓库中的校验脚本 lint/frontmatter.py 会扫描所有 Markdown 文件的 frontmatter检查 YAML 语法通过 yamllint以及允许的键name、where_x_eq_name、category、filename、contributors、translators其中contributors与translators必须是由[作者, 可选URL]组成的列表。而 CONTRIBUTING.md 进一步说明非英文文章继承英文文章的 frontmatter但可以覆盖提交 Pull Request 时需在标题前加[language/lang-code]前缀例如本文档对应的标签就是[dart/es]。教程概述Dart 是什么教程开篇用三句话为 Dart 定性Dart 是编程语言领域的新人。它借鉴了许多其他主流语言同时不会偏离其兄弟语言 JavaScript 太远。与 JavaScript 一样Dart 的目标是提供良好的浏览器集成。作为对照英文原版 dart.md 给出了更完整的现代描述Dart 是单线程single-threaded、通用目的的编程语言支持Streams、Futures即 JavaScript 中的 Promise、泛型、一等函数闭包与静态类型检查可运行在 Web、CLI、桌面、移动端与 IoT 设备等各类平台。而Dart 最有争议的特性必然是它的可选类型escritura opcional / optional typing。教程中大量示例刻意不声明任何类型也照常运行正是为了演示这一点英文原版则更新为静态类型安全与健全类型检查Sound Type checks反映出 Dart 语言从可选类型走向健全空安全null safety的演进。环境准备与运行方式这份教程是可执行的官方建议两种运行路径本地 Dart 运行时安装 Dart SDK 后将代码保存为.dart文件英文原版 frontmatter 中声明了filename: learndart.dart在命令行执行dart learndart.dart在线 DartPad访问 Dart 官方的云代码沙箱英文原版指向 https://dartpad.dev/把整段代码复制粘贴即可运行还可点击 New Pad选择 Flutter 模板直接运行 Flutter 示例。西班牙语版保留的是早期站点 try.dartlang.org英文原版已更新为 dartpad.dev。程序入口统一为main()函数。教程末尾的main()将example1到example30的函数引用放入一个列表再用forEach逐个调用main() { print(Learn Dart in 15 minutes!); [example1, example2, ..., example30 ].forEach((ef) ef()); }这本身就是 Dart 一等函数 集合遍历 的一个范例函数可以作为列表元素存放并延迟调用。函数声明、嵌套、匿名与闭包Dart 中函数声明与方法声明长得一样且可以嵌套。声明形式为name() {}或name() 单行表达式;——后者即粗箭头fat arrow函数对表达式结果有隐式返回example1() { nested1() { nested2() print(example1 anidado 1 anidado 2); nested2(); } nested1(); }匿名函数不包含名称可直接作为参数传入example2() { nested1(fn) { fn(); } nested1(() print(example2 anidado 1)); }声明函数参数时可以显式声明该参数函数接收的参数个数与名称英文原版补充了显式返回类型写法void Function() fn也可以不声明example3() { planA(fn(informSomething)) { fn(example3 plan A); } planB(fn) { // O no declarar el número de parámetros. fn(example3 plan B); } planA((s) print(s)); planB((s) print(s)); }函数对外部变量具有闭包访问权closure accessvar example4Something Example4 anidado 1; example4() { nested1(fn(informSomething)) { fn(example4Something); } nested1((s) print(s)); }英文原版在此补充了一个重要细节example4Something被推断为String类型——Dart 会在变量被赋值时进行类型推断type inference。类实例成员、静态成员与实例化类声明形式为class NombreDeClase { [cuerpoDeClase] }类体中可包含实例方法、实例变量以及类方法、类变量用static修饰。教程通过example5example7三个示例递进演示example5类的sayIt()方法同样对外部变量有闭包访问权创建匿名实例后直接调用方法new Example5Class().sayIt()英文原版注明new关键字在 Dart 中是可选的后续示例常省略example6实例变量instanceVariable被实例方法访问example7static var classVariable与static sayItFromClass()通过类名直接调用Example7Class.sayItFromClass()而实例方法sayItFromInstance()依然可以访问类变量——静态成员对实例可见。class Example7Class { static var classVariable Example7 variable de clase; static sayItFromClass() { print(classVariable); } sayItFromInstance() { print(classVariable); } } example7() { Example7Class.sayItFromClass(); new Example7Class().sayItFromInstance(); }泛型英文原版补充英文原版 dart.md 在类之后插入了一节泛型GenericsT泛指任意实例化类型E用于List/Set/Iterable元素K/V用于 Map 的键值对。泛型既可修饰类也可修饰方法class GenericExampleT { void printType() { print($T); } genericMethodM() { print(class:$T, method: $M); } }常量子面量、List 与 Map字符串和数字默认是常量但数组List和 Map 在函数/方法体外类外部作用域必须显式声明为const类似 JavaScript 的Object.freeze()var example8Array const [Example8 arreglo constante], example8Map const {algunaKey: Example8 mapa constante}; example8() { print(example8Array[0]); print(example8Map[algunaKey]); }英文原版进一步引入了带泛型的显式集合声明与引用传递语义ListString explicitList new ListString.empty(); MapString, dynamic explicitMaps new MapString, dynamic();并提醒把 List 赋值给新变量时由于 Dart 是按值传递引用pass-reference-by-value新变量在打印时会以()Iterable 形态而非[]List 形态显示可用explicitList.toList()重新转回ListE。循环for、while、for-in 与 forEach教程example9一口气演示了四种遍历方式——标准for、while、现代for-in与函数式forEach英文原版还补充了map与where等函数式回调var example9Array const [a, b]; example9() { for (var i 0; i example9Array.length; i) { print(example9 ciclo for ${example9Array[i]}); } var i 0; while (i example9Array.length) { print(example9 ciclo while ${example9Array[i]}); i; } for (var e in example9Array) { print(example9 ciclo for-in ${e}); } example9Array.forEach((e) print(example9 ciclo forEach ${e})); }对字符串同样可以按字符遍历或提取子串example10这体现了 Dart 中字符串支持下标索引[i]与substring(i, i 1)的能力。数值类型与算术example11演示了int与double的字面量运算var i 1 320, d 3.2 0.01;。英文原版在此扩展了完整的数字类型体系三种数字格式int、double、num其中num是int与double的父类型num变量可以同时容纳整数与浮点num myNumDouble 2.2;合法从int隐式向下转型到double、从num赋值给int会报错——英文原版特别注明隐式向下转型在 Dart 2.9 中被移除必须显式使用as断言myFinalNumInt as intdouble myDouble 0;会自动补上小数位变成0.0。日期时间方面example12DateTime.now()获取当前时间now.add(new Duration(days: 1))做日期算术得到明天example12() { var now new DateTime.now(); print(example12 ahora ${now}); now now.add(new Duration(days: 1)); print(example12 manana ${now}); }正则表达式example13使用RegExp(^s.?g\$)构造正则并通过hasMatch()判断是否匹配example13() { var s1 alguna cadena, s2 alguna, re new RegExp(^s.?g\$); match(s) { if (re.hasMatch(s)) { print(example13 regexp embona ${s}); } else { print(example13 regexp no embona ${s}); } } match(s1); match(s2); }布尔表达式、动态类型与 null 陷阱example14是教程中最具教学价值的部分之一完整演示了 Dart 旧版本可选类型时代的隐式转换行为与类型检查的边界true显式布尔var a true; if (a)正常进入真分支动态类型 null 转 boolvar b;未初始化时b是动态类型b abc后在if (b)中会抛错进入catch而b null后if (b)会走else分支英文原版注释为Failed assertion: boolean expression must not be null静态类型 null 不能转 boolvar c abc; c null;之后if (c)直接编译失败代码被注释掉。example14() { var a true; if (a) { print(true, a is $a); } a null; if (a) { print(true, a es $a); } else { print(false, a es $a); // corre aquí } var b; // b es de tipo dinámico b abc; try { if (b) { ... } } catch (e) { print(error, b es $b); // esto podría ser ejecutado pero consiguió error } b null; if (b) { ... } else { ... } var c abc; c null; // compilación fallida // if (c) { ... } }这段代码清晰地划出了动态类型宽松、静态类型严格的分界线——也正是 Dart 所谓可选类型争议的核心所在。异常处理try / catch / finally / throwexample15展示嵌套的异常处理throw可以抛出任意对象此处直接抛字符串内层catch捕获后打印并throw e重新抛出re-throw外层catch再次捕获最后finally无论如何都会执行example15() { try { try { throw Algun error inesperado.; } catch (e) { print(example15 una excepcion: ${e}); throw e; // Re-throw } } catch (e) { print(example15 atrapa la excepcion que ha sido relanzada: ${e}); } finally { print(example15 aún ejecuta finally); } }字符串进阶StringBuffer、拼接、引号与插值高效拼接example16动态构建长字符串应使用StringBuffer的write()方法或用List.join()合并字符串数组example16() { var sb new StringBuffer(), a [a, b, c, d], e; for (e in a) { sb.write(e); } print(example16 cadena de caracteres dinamica creada con StringBuffer ${sb.toString()}); print(example16 union de arreglo de cadena de caracteres ${a.join()}); }字面量相邻拼接example17字符串字面量紧挨着写、无需任何运算符即可拼接单/双引号等价example18两种引号没有区别可利用这种灵活性避免转义——例如 HTML 属性用双引号时外层字符串用单引号反之亦然Example18 a hrefetc与Dont cant Im Etc直接相邻三引号多行字符串example19...或...可跨多行并保留换行符$插值example20${表达式}插值表达式结果$变量名插值变量内容\$转义为字面$example20() { var s1 \${s}, s2 \$s; print(Example20 \$ interpolation ${s1} or $s2 works.); }类型标注、getter/setter 与检查模式example21引入带泛型类型标注的类ListString字段、get/set访问器、int get length与void add(String name)方法。教程在此处点明 Dart 类型系统的运行时哲学到目前为止我们没声明任何类型程序也运行良好。事实上类型在运行时是被忽略的。即使类型写错了程序也会疑罪从无地照常运行。存在一个检查类型错误的运行时参数——检查模式checked mode它在开发期很有用但因为额外检查更慢部署运行时通常关闭。class Example21 { ListString _names; Example21() { _names [a, b]; } ListString get names _names; set names(ListString list) { _names list; } int get length _names.length; void add(String name) { _names.add(name); } }同时它展示了类型标注的真实价值标注 API 类型能帮助 IDE 更好地重构、自动补全与查错。继承、混入mixin与构造器继承extendsexample22是最简单的继承形态class NombreDeClase extends OtraClase {}子类直接继承父类的_name与namegetterclass Example22A { var _name ¡Algun Nombre!; get name _name; } class Example22B extends Example22A {}混入withexample23演示 mixin形式为class Nombre extends AlgunaClase with OtraClase {}必须继承某个类才能混入另一个类混入模板类当时不能有构造函数mixin 主要用于跨远亲类共享方法避免单继承阻碍代码复用混入写在with关键字之后。class Example23A {} class Example23Utils { addTwo(n1, n2) { return n1 n2; } } class Example23B extends Example23A with Example23Utils { addThree(n1, n2, n3) { return addTwo(n1, n2) n3; } } example23() { var o new Example23B(), r1 o.addThree(1, 2, 3), r2 o.addTwo(1, 2); print(Example23 addThree(1, 2, 3) results in ${r1}); print(Example23 addTwo(1, 2) results in ${r2}); }英文原版特别注明Dart 3 起声明 mixin 必须使用mixin关键字而不是classmixin Example23Utils { ... }这是语言演进的直接证据。构造器与 super 委托example24展示构造器与父类构造器委托构造器与类同名形式为AlgunaClase() : super() {}其中: super()部分可选用于把常量参数委托给父类构造器class Example24A { var _value; Example24A({value: algunValor}) { _value value; } get value _value; } class Example24B extends Example24A { Example24B({value: algunOtroValor}) : super(value: value); }构造器简写this.参数example25是更简单的构造器简写用this.nombreParametro前缀即可自动把参数赋给同名的实例变量class Example25 { var value, anotherValue; Example25({this.value, this.anotherValue}); } example25() { var o new Example25(value: a, anotherValue: b); print(example25 atajo para el constructor ${o.value} y ${o.anotherValue}); }final 实例变量example27演示final变量只能赋值一次类的final实例变量可通过构造器初始化列表冒号:后的部分赋值class Example27 { final color1, color2; Example27({this.color1, color2}) : color2 color2; }参数类型命名参数、可选位置参数与默认值example26系统讲解参数声明语法声明在{}中为命名参数named parameters调用时以name: value传参顺序可以任意声明在[]中为可选位置参数optional positional parameters按位置传入、可省略。example26() { var _name, _surname, _email; setConfig1({name, surname}) { _name name; _surname surname; } setConfig2(name, [surname, email]) { _name name; _surname surname; _email email; } setConfig1(surname: Doe, name: John); setConfig2(Mary, Jane); }英文原版进一步补充了三个专项示例把可选参数讲透example31可选位置参数findVolume31(int length, int breath, [int? height])——[ ]括起来的参数可选调用findVolume31(10,20,30)或findVolume31(10,20)均合法example32可选命名参数findVolume32(int length, int breath, {int? height})——{ }括起来传值需用参数名height: 30顺序无关example33可选默认参数findVolume33(int length, int breath, {int height10})——不传值时自动取默认值10。example33之后的空安全相关运算符null-aware operators也有提及var isBool true; var hasString isBool ?? default String;??在左侧为 null 时返回右侧默认值。库导入dart: 核心库与 package: 包管理example28讲解导入机制核心库用import dart:NombreLibreríapub 包管理器的包用import package:NombrePaquete本地文件用import rutaLibrería。所有 import 必须放在其他代码声明之前。示例通过extends IterableBase来自dart:collection实现自定义可迭代类import dart:collection; import dart:math as DM; class Example28 extends IterableBase { var names; Example28() { names [a, b]; } get iterator names.iterator; } example28() { var o new Example28(); o.forEach((name) print(example28 ${name})); }注意文件顶部还用了带别名的导入import dart:math as DM;后续示例通过DM.Random()调用避免命名冲突。流控制switch、if-else、三元与闭包回调example29汇总 Dart 的流控制武器库标准switch需breakif-else if-else与三元运算符..?..:..闭包与匿名函数break、continue、return语句。example29() { var v true ? 30 : 60; switch (v) { case 30: print(example29 sentencia switch); break; } if (v 30) { } else if (v 30) { } else { print(example29 sentencia if-else); } callItForMe(fn()) { return fn(); } rand() { v new DM.Random().nextInt(50); return v; } while (true) { print(example29 callItForMe(rand) ${callItForMe(rand)}); if (v ! 30) { break; } else { continue; } // Nunca llega aquí. } }注意rand()每次生成 049 的随机数while (true)循环配合break/continue构成了一个永不抵达注释行的经典演示。综合实战数字解析与二分猜数游戏example30是教程的压轴综合练习串起多个知识点整数除法~/运算符保留整数结果top int.parse(123) ~/ n2double 转 int(2.0).toInt()字符串解析int.parse(123)随机数DM.Random().nextInt(top 1)nextInt上限独占故1三元运算符tooHigh ? high : low循环与闭包guessNumber内部函数访问外部n、gn、tooHighwhile循环按二分法收缩top/bottom区间。example30() { var gn, tooHigh false, n, n2 (2.0).toInt(), top int.parse(123) ~/ n2, bottom 0; top top ~/ 6; gn new DM.Random().nextInt(top 1); print(example30 Adivina un número entre 0 y ${top}); guessNumber(i) { if (n gn) { print(example30 ¡Adivinaste correctamente! El número es ${gn}); } else { tooHigh n gn; print(example30 Número ${n} es demasiado ${tooHigh ? high : low}. Intenta nuevamente); } return n gn; } n (top - bottom) ~/ 2; while (!guessNumber(n)) { if (tooHigh) { top n - 1; } else { bottom n 1; } n bottom ((top - bottom) ~/ 2); } }这个示例把字符串解析、类型转换、随机数、三元与二分算法熔于一炉是对前面所有语法点的实战检验。main() 入口与懒加载哲学教程最后点明 Dart 程序的设计约定程序只有一个入口点即main()函数。main()之外的外部作用域不应有任何期待被执行的代码。这有助于程序更快启动甚至按需懒加载启动所需内容。这也是 Dart 作为 Web/移动端语言追求启动性能的体现。在仓库中的延伸阅读若想继续深挖仓库提供了同一主题的多语言版本可对照阅读以理解各版本演进英文原版 dart.md包含泛型、mixin关键字Dart 3、空安全运算符、可选参数三个专项示例example31–example33等更新内容中文版 zh-cn/dart.md繁体中文版 zh-tw/dart.md巴西葡萄牙语版 pt-br/dart.md。这些文件与 es/dart.md 遵循同一套 frontmatter 与行宽80 字符内规范均由 lint/frontmatter.py 与 markdownlint 统一校验具体约定见 CONTRIBUTING.md。结语es/dart.md 用 30 个可执行示例把 Dart 的函数、类、继承、mixin、构造器、泛型、集合、字符串、正则、异常与流控制完整串讲了一遍并借可选类型的争议性特性揭示了 Dart 类型系统的演进脉络。对照英文原版 dart.md 可以看到语言本身的成长——从可选类型到静态类型安全、从classmixin 到mixin关键字、从隐式向下转型到显式as断言。把这 30 个示例粘贴进 DartPad 或本地dart运行时逐段运行是最快的上手方式。赞分享文档教程【免费下载链接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载相关推荐Bash Shell 脚本完全入门基于 Learn X in Y Minutes 仓库西班牙语教程的实战详解Bash Shell 脚本完全入门基于 Learn X in Y Minutes 仓库西班牙语教程的实战详解 本篇技术指南以 es/bash.md https文档教程Learn X in Y minutesScala 可扩展语言快速入门实战指南基于 learnxinyminutes-docs 深度解读Learn X in Y minutesScala 可扩展语言快速入门实战指南基于 learnxinyminutes docs 深度解读 本文以 lear文档教程Learn X in Y Minutes 西班牙语版 C 教程精读从基础语法到面向对象编程实战Learn X in Y Minutes 西班牙语版 C 教程精读从基础语法到面向对象编程实战 本篇技术指南以开源仓库 learnxinyminutes do文档教程上一篇Windows APK直接运行终极方案告别模拟器卡顿的跨平台应用兼容工具下一篇BIMPGIMP批量图像处理完整指南 - 终极免费批量编辑解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考