# Hello, World

By [Untitled](https://paragraph.com/@0xe29bae43a910e40b20c6603972c502990cbc47c2) · 2023-11-02

---

> ### [创建一个项目目录](https://book.cairo-lang.org/zh-cn/ch01-02-hello-world.html#%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E9%A1%B9%E7%9B%AE%E7%9B%AE%E5%BD%95)
> 
> 你首先要做一个目录来存储你的Cairo代码。对于Cairo来说，你的代码放在哪里并不重要。 但对于本书中的练习和项目来说，我们建议在你的主目录下建立一个 _cairo\_projects_ 目录，并将你的所有项目存放在这里。
> 
> 打开一个终端，输入以下命令，建立一个 _cairo\_projects_ 目录 并在 _cairo\_projects_ 目录下为 "Hello, world!"项目建立一个目录。
> 
> > 注意：从现在起，对于书中显示的每个示例，我们都假定 你都是在 Scarb 项目目录中进行编码。如果您没有使用 Scarb，并试图从其他目录运行示例，可能需要相应调整命令或创建一个 Scarb 项目。
> 
> 对于Linux、macOS和Windows上的PowerShell，输入：
> 
>     mkdir ~/cairo_projects
>     cd ~/cairo_projects
>     
> 
> 对于Windows CMD，请输入以下内容：
> 
>     > mkdir "%USERPROFILE%\cairo_projects"
>     > cd /d "%USERPROFILE%\cairo_projects"
>     
> 
> ### [用Scarb创建一个项目](https://book.cairo-lang.org/zh-cn/ch01-02-hello-world.html#%E7%94%A8scarb%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E9%A1%B9%E7%9B%AE)
> 
> 让我们使用 Scarb 创建一个新项目。
> 
> 导航到你的项目目录（或你决定放代码的地方）。然后运行以下命令：
> 
> scarb new hello\_world 它创建了一个新的目录和项目，名为hello\_world。我们把我们的项目命名为hello\_world，因此Scarb会在同名的目录下创建它的文件。
> 
> 用cd hello\_world命令进入hello\_world目录。你会看到Scarb已经为我们生成了两个文件和一个目录：一个Scarb.toml文件和一个src目录，里面有一个lib.cairo文件。
> 
> 它还初始化了一个新的Git仓库和一个.gitignore文件
> 
> 注意：Git是一个常见的版本控制系统。你可以通过使用--vcs标志停止使用版本控制系统。 运行scarb new -help以查看可用选项。
> 
> 在你选择的文本编辑器中打开 Scarb.toml 。它看起来应该与示例1-2中的代码相似。
> 
> 文件名：Scarb.toml
> 
> \[package\] name = "hello\_world" version = "0.1.0"
> 
> See more keys and their definitions at [https://docs.swmansion.com/scarb/docs/reference/manifest](https://docs.swmansion.com/scarb/docs/reference/manifest)
> ===========================================================================================================================================================
> 
> \[dependencies\]
> 
> foo = { path = "vendor/foo" }
> =============================
> 
> 示例1-2：由scarb new生成的Scarb.toml的内容
> 
> 这个文件是TOML（Tom's Obvious, Minimal Language）的格式，是Scarb的配置文件格式。
> 
> 第一行，\[package\]，是一个章节标题，表示下面的语句是在配置一个包。随着我们向这个文件添加更多的信息，我们将添加其他章节。
> 
> 接下来的两行设置了Scarb在编译你的程序时需要的配置信息：名称和要使用的Scarb版本。
> 
> 最后一行，\[dependencies\]，是一个章节的开始，该章节供你列出你的项目的所有依赖。在Cairo中，代码包被称为crate。在这个项目中，我们不需要任何其他的crate。
> 
> 注意：如果你要为Starknet构建合约，你需要添加Scarb文档中提到的starknet依赖关系。
> 
> Scarb创建的另一个文件是src/lib.cairo，让我们删除其中所有的内容，放入以下内容，我们将在后面解释原因。
> 
> mod hello\_world; 然后创建一个名为src/hello\_world.cairo的新文件，并将以下代码放入其中：
> 
> 文件名： src/hello\_world.cairo
> 
> use debug::PrintTrait; fn main() { 'Hello, World!'.print(); } 我们刚刚创建了一个名为lib.cairo的文件，其中包含一个模块声明，引用了另一个名为 hello\_world的模块，以及包含 hello\_world模块的实现细节的文件hello\_world.cairo。
> 
> Scarb要求你的源文件位于src目录中。
> 
> 顶层项目目录是为README文件、许可证信息、配置文件和任何其他与代码无关的内容保留的。 Scarb确保所有项目组件都有一个指定的位置，维持一个结构化的组织架构。
> 
> 如果你启动了一个不使用Scarb的项目，你可以把它转换成一个使用Scarb的项目。将项目代码移到src目录下，并创建一个适当的Scarb.toml文件。
> 
> 编译Scarb项目 在你的hello\_world目录中，通过输入以下命令来编译你的项目：
> 
> $ scarb build Compiling hello\_world v0.1.0 (file:///projects/Scarb.toml) Finished release target(s) in 0 seconds 这个命令在target/dev中创建了一个sierra文件，现在我们先忽略sierra文件。
> 
> 如果你正确安装了Cairo，你应该能够运行并看到以下输出：
> 
> $ scarb cairo-run running hello\_world ... \[DEBUG\] Hello, World! (raw: 0x48656c6c6f2c20776f726c6421
> 
> Run completed successfully, returning \[\] 无论你的操作系统如何，终端里都应该打印出字符串Hello, world!。
> 
> 如果 "Hello，world！"打印出来了，那么恭喜你！你已经正式写了一个Cairo程序！ 你已经成为了一名Cairo程序员--欢迎!
> 
> ### [解析Cairo程序](https://book.cairo-lang.org/zh-cn/ch01-02-hello-world.html#%E8%A7%A3%E6%9E%90cairo%E7%A8%8B%E5%BA%8F)
> 
> 让我们详细回顾一下这个 "Hello，world！"程序。这里有拼图的第一部分：
> 
>     fn main() {
>     
>     }
>     
> 
> 这些代码定义了一个名为 `main`的函数。`main`函数很特别：它总是每个可执行的Cairo程序中运行的第一个代码。 这里，第一行声明了一个名为 `main`的函数，没有参数，也不返回。如果有参数，它们会被放在括号`()`里。
> 
> 函数主体被包裹在"{}"中。Cairo要求在所有的函数体周围加上大括号 将开头的左大括号与函数声明放在同一行是很好的编码风格。 别忘了在它们中间加一个空格。
> 
> > 注意：如果你想在Cairo项目中使用一个统一代码风格标准，你可以 使用自动格式化工具`scarb fmt`来将你的代码格式化为 特定的代码风格（更多关于`scarb fmt`的信息见 [附录D](https://book.cairo-lang.org/zh-cn/appendix-04-useful-development-tools.html)）。Cairo团队已经将这个工具 包含在标准的Cairo发行版中，就像`cairo-run`一样，所以它应该已经被 已经安装在你的计算机上了!
> 
> 在主函数声明之前，`use debug::PrintTrait;`一行负责导入另一个模块中定义的项目。在这个例子中，我们从Cairo核心库中导入了`PrintTrait`项目。通过这样做，我们获得了在可以打印的数据类型上使用`print()`方法的能力。
> 
> `main`函数的主体包含以下代码：
> 
>         'Hello, World!'.print();
>     
> 
> 这一行完成了这个小程序的所有工作：将文本打印到屏幕上。这里有四个重要的细节需要注意。
> 
> 首先，Cairo的风格是用四个空格缩进，而不是用制表符。
> 
> 第二，调用的`print()`函数是来自trait`PrintTrait`的一个方法。这个trait是从Cairo核心库中导入的，它定义了如何将不同数据类型的值打印到屏幕上。在我们的例子中，我们的文本被定义为 "short string"，这是一个ASCII字符串，可以适合Cairo的基本数据类型，即`felt252`类型。通过调用`'Hello, world!'.print()`，我们正在调用`PrintTrait`trait的`felt252`实现的`print()`方法。
> 
> 第三，看见了`'Hello, world!'`短字符串么。我们把这个短字符串作为一个参数传递给`print()`，因此短字符串被打印到屏幕上。
> 
> 第四，我们用分号（`;`）来结束这一行，这表示这个表达式已经结束，下一个表达式准备开始。大多数Cairo的代码行以分号结束。
> 
> [运行测试](https://book.cairo-lang.org/zh-cn/ch01-02-hello-world.html#%E8%BF%90%E8%A1%8C%E6%B5%8B%E8%AF%95)
> -------------------------------------------------------------------------------------------------------
> 
> 要运行与特定软件包相关的所有测试，可以使用`scarb test`命令。 它本身并不是一个测试运行工具，而是将测试工作委托给所选的测试工具。Scarb预装了`scarb cairo-test`扩展，它捆绑了Cairo的本地测试运行器。它也是scarb test默认使用的测试运行器。 要使用第三方测试运行器，请参考[Scarb文档](https://docs.swmansion.com/scarb/docs/extensions/testing.html#using-third-party-test-runners)。
> 
> 测试函数用`#[test]`属性标记，运行`scarb test`将运行代码库中`src/`目录下的所有测试函数。
> 
>     ├── Scarb.toml
>     ├── src
>     │   ├── lib.cairo
>     │   └── file.cairo
>     
> 
> **Scarb 项目结构示例**
> 
> 让我们回顾一下到目前为止我们所了解到的关于Scarb的情况：
> 
> *   我们可以使用 `scarb new` 创建项目。
>     
> *   我们可以使用 `scarb build` 生成编译后的 Sierra 代码。
>     
> *   我们可以在 `Scarb.toml` 中定义自定义脚本，并使用 `scarb run` 命令调用它们。
>     
> *   我们可以使用 `scarb test` 命令运行测试。
>     
> 
> 使用Scarb的另一个好处是，无论你在哪个操作系统上工作，命令都是一样的。所以我们将不再提供Linux和macOS与Windows的具体说明。

---

*Originally published on [Untitled](https://paragraph.com/@0xe29bae43a910e40b20c6603972c502990cbc47c2/hello-world)*
