@@ -13,6 +13,7 @@ layout: multipage-overview
13
13
permalink : " /zh-cn/scala3/book/:title.html"
14
14
---
15
15
16
+ <h5 >编写<span class =" tag tag-inline " >仅Scala 3 适用</span >的一行程序</h5 >
16
17
17
18
Scala 3 提供了一种定义可以从命令行调用的程序的新方法:在方法中添加 ` @main ` 注释会将其变成可执行程序的入口点:
18
19
@@ -26,16 +27,10 @@ Scala 3 提供了一种定义可以从命令行调用的程序的新方法:在
26
27
{% endtab %}
27
28
{% endtabs %}
28
29
29
- 只需将该行代码保存在一个名为 * Hello.scala* 的文件中——文件名不必与方法名匹配——并使用 ` scalac ` 编译它 :
30
+ 只需将该行代码保存在一个名为 * Hello.scala* 的文件中——文件名不必与方法名匹配——并使用 ` scala ` 运行它 :
30
31
31
32
``` bash
32
- $ scalac Hello.scala
33
- ```
34
-
35
- 然后用 ` scala ` 运行它:
36
-
37
- ``` bash
38
- $ scala hello
33
+ $ scala Hello.scala
39
34
Hello, world
40
35
```
41
36
@@ -81,8 +76,8 @@ $ scala happyBirthday 23 Lisa Peter
81
76
Happy 23rd Birthday, Lisa and Peter!
82
77
```
83
78
84
- 如图所示 ,` @main ` 方法可以有任意数量的参数。
85
- 对于每个参数类型,必须是 ` scala.util.CommandLineParser.FromString ` 类型类的一个 [ given实例] ({% link _ overviews /scala3-book/ca-context-parameters.md %}),它将参数 ` String ` 转换为所需的参数类型。
79
+ 如上所示 ,` @main ` 方法可以有任意数量的参数。
80
+ 对于每个参数类型,必须是 ` scala.util.CommandLineParser.FromString ` 类型类的一个 [ given实例] ({% link _ zh-cn/overviews /scala3-book/ca-context-parameters.md %}),它将参数 ` String ` 转换为所需的参数类型。
86
81
同样如图所示,主方法的参数列表可以以重复参数结尾,例如 ` String* ` ,它接受命令行中给出的所有剩余参数。
87
82
88
83
从 ` @main ` 方法实现的程序检查命令行上是否有足够的参数来填充所有参数,以及参数字符串是否可以转换为所需的类型。
@@ -96,6 +91,30 @@ $ scala happyBirthday sixty Fred
96
91
Illegal command line: java.lang.NumberFormatException: For input string: "sixty"
97
92
```
98
93
94
+ ## 用户自定义的类型作为参数
95
+
96
+ 正如上面指出的,编译器为参数类型寻找 ` scala.util.CommandLineParser.FromString ` 类型类 的given 实例。
97
+ 例如,我们自定义了一个 ` Color ` 类型,并希望当以参数使用。你可以像以下代码这样使用:
98
+
99
+ {% tabs method_3 %}
100
+ {% tab 'Scala 3 Only' for=method_3 %}
101
+
102
+ ``` scala
103
+ enum Color :
104
+ case Red , Green , Blue
105
+
106
+ given ComamndLineParser .FromString [Color ] with
107
+ def fromString (value : String ): Color = Color .valueOf(value)
108
+
109
+ @ main def run (color : Color ): Unit =
110
+ println(s " The color is ${color.toString}" )
111
+ ```
112
+
113
+ {% endtab %}
114
+ {% endtabs %}
115
+
116
+ 这对于您程序中的自定义类型以及可能使用的其他库中的类型,都是一样的。
117
+
99
118
## 细节
100
119
101
120
Scala 编译器从 ` @main ` 方法 ` f ` 生成程序,如下所示:
0 commit comments