@@ -29,27 +29,73 @@ permalink: "/zh-cn/scala3/book/:title.html"
2929因为 ` object ` 是单例,所以它的方法可以像 Java 类中的 ` static ` 方法一样被访问。
3030例如,此 ` StringUtils ` 对象包含一个与字符串相关的方法的小型集合:
3131
32+ {% tabs object_1 class=tabs-scala-version %}
33+ {% tab 'Scala 2' for=object_1 %}
34+
35+ ``` scala
36+ object StringUtils {
37+ def isNullOrEmpty (s : String ): Boolean = s == null || s.trim.isEmpty
38+ def leftTrim (s : String ): String = s.replaceAll(" ^\\ s+" , " " )
39+ def rightTrim (s : String ): String = s.replaceAll(" \\ s+$" , " " )
40+ }
41+ ```
42+
43+ {% endtab %}
44+ {% tab 'Scala 3' for=object_1 %}
45+
3246``` scala
3347object StringUtils :
3448 def isNullOrEmpty (s : String ): Boolean = s == null || s.trim.isEmpty
3549 def leftTrim (s : String ): String = s.replaceAll(" ^\\ s+" , " " )
3650 def rightTrim (s : String ): String = s.replaceAll(" \\ s+$" , " " )
3751```
3852
53+ {% endtab %}
54+ {% endtabs %}
55+
3956由于 ` StringUtils ` 是一个单例,因此可以直接在对象上调用其方法:
4057
58+ {% tabs object_2 %}
59+ {% tab 'Scala 2 and 3' for=object_2 %}
60+
4161``` scala
4262val x = StringUtils .isNullOrEmpty(" " ) // true
4363val x = StringUtils .isNullOrEmpty(" a" ) // false
4464```
4565
66+ {% endtab %}
67+ {% endtabs %}
68+
4669## 伴生对象
4770
4871伴生类或对象可以访问其伙伴的私有成员。
4972对不特定于伴生类实例的方法和值使用伴生对象。
5073
5174此示例演示了伴生类中的 ` area ` 方法如何访问其伴生对象中的私有 ` calculateArea ` 方法:
5275
76+ {% tabs object_3 class=tabs-scala-version %}
77+ {% tab 'Scala 2' for=object_3 %}
78+
79+ ``` scala
80+ import scala .math ._
81+
82+ class Circle (radius : Double ) {
83+ import Circle ._
84+ def area : Double = calculateArea(radius)
85+ }
86+
87+ object Circle {
88+ private def calculateArea (radius : Double ): Double =
89+ Pi * pow(radius, 2.0 )
90+ }
91+
92+ val circle1 = new Circle (5.0 )
93+ circle1.area // Double = 78.53981633974483
94+ ```
95+
96+ {% endtab %}
97+ {% tab 'Scala 3' for=object_3 %}
98+
5399``` scala
54100import scala .math .*
55101
@@ -65,11 +111,38 @@ val circle1 = Circle(5.0)
65111circle1.area // Double = 78.53981633974483
66112```
67113
114+ {% endtab %}
115+ {% endtabs %}
116+
68117## 从 traits 创建模块
69118
70119对象还可用于实现创建模块的 trait。
71120这种技术需要两个traits,并将它们结合起来创建一个具体的 ` object ` :
72121
122+ {% tabs object_4 class=tabs-scala-version %}
123+ {% tab 'Scala 2' for=object_4 %}
124+
125+ ``` scala
126+ trait AddService {
127+ def add (a : Int , b : Int ) = a + b
128+ }
129+
130+ trait MultiplyService {
131+ def multiply (a : Int , b : Int ) = a * b
132+ }
133+
134+ // implement those traits as a concrete object
135+ object MathService extends AddService with MultiplyService
136+
137+ // use the object
138+ import MathService ._
139+ println(add(1 ,1 )) // 2
140+ println(multiply(2 ,2 )) // 4
141+ ```
142+
143+ {% endtab %}
144+ {% tab 'Scala 3' for=object_4 %}
145+
73146``` scala
74147trait AddService :
75148 def add (a : Int , b : Int ) = a + b
@@ -86,6 +159,9 @@ println(add(1,1)) // 2
86159println(multiply(2 ,2 )) // 4
87160```
88161
162+ {% endtab %}
163+ {% endtabs %}
164+
89165{% comment %}
90166NOTE: I don’t know if this is worth keeping, but I’m leaving it here as a comment for now.
91167
0 commit comments