11---
22layout : tour
3- title : Basics
3+ title : พื้นฐาน
44
55discourse : false
66
@@ -13,4 +13,309 @@ next-page: unified-types
1313previous-page : tour-of-scala
1414---
1515
16+ ในหน้านี้ เราจะครอบคลุมพื้นฐานของ Scala
17+ In this page, we will cover basics of Scala.
18+
19+ ## ทดลอง Scala ในเว็บบราวเซอร์
20+
21+ เราสามารถรัน Scala ในเว็บเบราว์เซอร์ด้วย ScalaFiddle
22+
23+ 1 . ไปที่ [ https://scalafiddle.io ] ( https://scalafiddle.io ) .
24+ 2 . วาง ` println("Hello, world!") ` ในด้านซ้าย.
25+ 3 . กดที่ปุ่ม "Run" . output จะแสดงในด้านขวา
26+
27+ ในขั้นตอนนี้ง่ายมาก ที่จะได้ประสบการณ์ของเรากับ Scala
28+
29+ หลายๆ โค้ดตัวอย่างในเอกสารนี้จะฝังใน ScalaFiddle ซึ่งคุณสามารถกดที่ปุ่ม Run เพื่อดูว่าโด้นนั้นๆ จะได้ผลลัพธ์อย่างไร
30+
31+ ## Expressions
32+
33+ Expression หรือ นิพจน์ เป็นโค้ดที่ทำการคำนวนได้
34+ ```
35+ 1 + 1
36+ ```
37+ เราสามารถแสดงผลลัพธ์ของ Expression ด้วยการใช้ ` println `
38+
39+ {% scalafiddle %}
40+ ``` tut
41+ println(1) // 1
42+ println(1 + 1) // 2
43+ println("Hello!") // Hello!
44+ println("Hello," + " world!") // Hello, world!
45+ ```
46+ {% endscalafiddle %}
47+
48+ ### Values
49+
50+ เราสามารถตั้งชื่อของผลลัพธ์ของ expression ด้วย keyword ` val `
51+
52+ ``` tut
53+ val x = 1 + 1
54+ println(x) // 2
55+ ```
56+
57+ ตั้งชื่อผลลัพธ์ อย่างเช่น ` x ` จะเรียก value การอ้างอิง value จะไม่มีการคำนวณอีกครั้ง
58+
59+ Value ไม่สามารถกำหนดค่าใหม่ได้
60+
61+ ``` tut:fail
62+ x = 3 // ตรงนี้ไม่ compile.
63+ ```
64+
65+ type (ชนิด) ของ value สามารถ inferred (อนุมาน) ได้ แต่เราสามารถกำหนดชนิดของ type อย่างชัดเจนได้ แบบนี้
66+
67+ ``` tut
68+ val x: Int = 1 + 1
69+ ```
70+
71+ สังเกตว่า การประกาศชนิดของ type ` Int ` จะระบุหลังจาก indentifier ` x ` เราจำเป็นต้องมี ` : `
72+
73+ ### Variables
74+
75+ ตัวแปรเหมือนกับ value ยกเว้นแต่ว่าเราสามารถกำหนดค่าใหม่ได้ เราสามารถกำหนดตัวแปรด้วย keyword ` var `
76+
77+ ``` tut
78+ var x = 1 + 1
79+ x = 3 // ตรงนี้ compile เพราะว่า "x" ถูกประกาศด้วย keyword "var"
80+ println(x * x) // 9
81+ ```
82+
83+ เราสามารถกำหนด type ได้ตามที่เราต้องการ:
84+
85+ ``` tut
86+ var x: Int = 1 + 1
87+ ```
88+
89+
90+ ## Blocks
91+
92+ เราสามารถรวมหลายๆ expression ไว้ด้วยกันด้วยการครอบด้วย ` {} ` เรียกมันว่า block
93+
94+ ผลลัพธ์ของ expression สุดท้ายใน block จะเป็นผลลัพธ์ของ block ทั้งหมดด้วย
95+
96+ ``` tut
97+ println({
98+ val x = 1 + 1
99+ x + 1
100+ }) // 3
101+ ```
102+
16103## Functions
104+
105+ function เป็น expression ที่รับ parameter ได้
106+
107+ เราสามารถกำหนด anonymous function (เป็น function ที่ไม่มีชื่อ) ที่ return ค่าตัวเลขบวกหนึ่ง:
108+
109+ ``` tut
110+ (x: Int) => x + 1
111+ ```
112+
113+ ในด้านซ้ายของ ` => ` คือรายการของ parameter ในด้านขวาเป็น expression ที่นำ parameter มาใช้
114+
115+ เราสามารถตั้งชื่อของ function ได้ดังนี้
116+
117+ {% scalafiddle %}
118+ ``` tut
119+ val addOne = (x: Int) => x + 1
120+ println(addOne(1)) // 2
121+ ```
122+ {% endscalafiddle %}
123+
124+ function สามารถรับ parameter ได้หลายตัว
125+
126+ {% scalafiddle %}
127+ ``` tut
128+ val add = (x: Int, y: Int) => x + y
129+ println(add(1, 2)) // 3
130+ ```
131+ {% endscalafiddle %}
132+
133+ หรือ เราจะไม่รับ parameter เลยก็ได้
134+
135+ ``` tut
136+ val getTheAnswer = () => 42
137+ println(getTheAnswer()) // 42
138+ ```
139+
140+ ## Methods
141+
142+ Method มีลักษณะเหมือนกับ function มาก แต่ว่าจะมีบางสิ่งที่แตกต่างกันระหว่าง method และ function
143+
144+ Method จะประกาศได้ด้วย keyword ` def ` ตามด้วยชื่อของ function, รายการ parameter, return type และ body ของ function
145+
146+ {% scalafiddle %}
147+ ``` tut
148+ def add(x: Int, y: Int): Int = x + y
149+ println(add(1, 2)) // 3
150+ ```
151+ {% endscalafiddle %}
152+
153+ สังเกตว่า การ return type จะประกาศ _ หลังจาก_ รายการ parameter และ colon ` : Int `
154+
155+ Method ยังสามารถรับรายการ parameter ได้หลายรายการ
156+
157+ {% scalafiddle %}
158+ ``` tut
159+ def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier
160+ println(addThenMultiply(1, 2)(3)) // 9
161+ ```
162+ {% endscalafiddle %}
163+
164+ หรือ ไม่มีรายการ parameter เลยก็ได้ อย่างเช่น
165+
166+ ``` tut
167+ def name: String = System.getProperty("user.name")
168+ println("Hello, " + name + "!")
169+ ```
170+
171+ และยังมีบางสิ่งที่แตกต่างกัน แต่ตอนนี้เราจะคิดว่า method มีความเหมือนกับ function
172+
173+ Method สามารถมี expression ได้หลายบรรทัด
174+ ``` tut
175+ def getSquareString(input: Double): String = {
176+ val square = input * input
177+ square.toString
178+ }
179+ ```
180+ expression สุดท้ายใน body เป็น expression ที่ return value ของ method (Scala ก็มี keyword ` return ` แต่ว่าไม่ค่อยได้ใช้)
181+
182+ ## Classes
183+
184+ เราสามารถประกาศ class ได้ด้วย keyword ` class ` ตามด้วยชื่อของ class และ constructor parameters
185+
186+ ``` tut
187+ class Greeter(prefix: String, suffix: String) {
188+ def greet(name: String): Unit =
189+ println(prefix + name + suffix)
190+ }
191+ ```
192+ return type ของ method ` greet ` เป็น ` Unit ` ซึ่งอาจจะกล่าวได้ว่าไม่มีการ return มันใช้เหมือน ` void ` ใน Java และ C (ความแตกต่างคือทุกๆ expression ของ Scala จำเป็นต้องมีค่า ซึ่งเป็น singleton vlaue จริงๆ ของ Unit เขียนด้วย () ซึ่งไม่มีข้อมูลใดๆ)
193+
194+ เราสามารถสร้าง instance ของ class ได้ด้วย keyword ` new `
195+
196+ ``` tut
197+ val greeter = new Greeter("Hello, ", "!")
198+ greeter.greet("Scala developer") // Hello, Scala developer!
199+ ```
200+
201+ เราจะครอบคลุมเรื่องของ class ในเชิงลึก [ ภายหลัง] ( classes.html )
202+
203+ ## Case Classes
204+
205+ Scala มี type ชนิดพิเศษของ class เรียกว่า "case" class โดยเริ่มต้นแล้ว case class เป็นค่าที่เปลี่ยนแปลงไม่ได้ (immutable) และสามารถเปลียบเทียบด้วย value เราสามารถประกาศ case class ด้วย keyword ` case class `
206+
207+ ``` tut
208+ case class Point(x: Int, y: Int)
209+ ```
210+
211+ เราสามารถสร้าง instant ของ case class โดยไม่ต้องใช้ keyword ` new `
212+
213+ ``` tut
214+ val point = Point(1, 2)
215+ val anotherPoint = Point(1, 2)
216+ val yetAnotherPoint = Point(2, 2)
217+ ```
218+
219+ และสามารถเปรียบเทียบค่าของ case class ได้
220+
221+ ``` tut
222+ if (point == anotherPoint) {
223+ println(point + " and " + anotherPoint + " are the same.")
224+ } else {
225+ println(point + " and " + anotherPoint + " are different.")
226+ } // Point(1,2) and Point(1,2) are the same.
227+
228+ if (point == yetAnotherPoint) {
229+ println(point + " and " + yetAnotherPoint + " are the same.")
230+ } else {
231+ println(point + " and " + yetAnotherPoint + " are different.")
232+ } // Point(1,2) and Point(2,2) are different.
233+ ```
234+
235+ เป็นตัวอย่างการใช้งานของ case class ที่เราอยากจะแนะนำ และอยากให้คุณตกหลุมรักมัน เราจะครอบคลุมในเชิงชึกใน [ ภายหลัง] ( case-classes.html )
236+
237+ ## Objects
238+
239+ Object เป็น instance เดี่ยวของ definition ของมัน เราสามารถคิดว่ามันเป็น singleton ของ class ที่มันเป็นเจ้าของ
240+
241+ เราสามารถประกาศ object ได้ด้วย keyword ` object `
242+
243+ ``` tut
244+ object IdFactory {
245+ private var counter = 0
246+ def create(): Int = {
247+ counter += 1
248+ counter
249+ }
250+ }
251+ ```
252+
253+ เราสามารถเข้าถึง object ด้วยการอ้างอิงถึงชื่อของมัน
254+
255+ ``` tut
256+ val newId: Int = IdFactory.create()
257+ println(newId) // 1
258+ val newerId: Int = IdFactory.create()
259+ println(newerId) // 2
260+ ```
261+
262+ เราจะครอบคลุมในเชิงลึกใน [ ภายหลัง] ( singleton-objects.html )
263+
264+ ## Traits
265+
266+ Trait เป็น type ที่บรรจุ field และ method ที่แน่นอน เราสามารถรวม trait หลายๆ trait เข้าด้วยกันได้
267+
268+ เราสามารถประกาศ trait ได้ด้วย keyword ` trait `
269+
270+ ``` tut
271+ trait Greeter {
272+ def greet(name: String): Unit
273+ }
274+ ```
275+
276+ Trait สามารถมี default implementation ได้
277+
278+ {% scalafiddle %}
279+ ``` tut
280+ trait Greeter {
281+ def greet(name: String): Unit =
282+ println("Hello, " + name + "!")
283+ }
284+ ```
285+
286+ เราสามารถขยาย traint ได้ด้วย keyword ` extents ` และ overrid implementation ด้วย keyword ` override `
287+
288+ ``` tut
289+ class DefaultGreeter extends Greeter
290+
291+ class CustomizableGreeter(prefix: String, postfix: String) extends Greeter {
292+ override def greet(name: String): Unit = {
293+ println(prefix + name + postfix)
294+ }
295+ }
296+
297+ val greeter = new DefaultGreeter()
298+ greeter.greet("Scala developer") // Hello, Scala developer!
299+
300+ val customGreeter = new CustomizableGreeter("How are you, ", "?")
301+ customGreeter.greet("Scala developer") // How are you, Scala developer?
302+ ```
303+ {% endscalafiddle %}
304+
305+ จากตัวอย่างนี้ ` defaultGreeter ` ขยายเพียง trait เดียว แต่มันสามารถขยายหลาย trait
306+
307+ เราจะครอบคลุมในเชิงลึกใน [ ภายหลัง] ( traits.html )
308+
309+ ## Main Method
310+
311+ main method เป็น entry point หรือจุดเริ่มต้นของโปรแกรม ใน Java Virtual Machine
312+ ต้องการ main method ชื่อว่า ` main ` และสามารถรับ argument ที่เป็น array ของ string
313+
314+ ใช้ object เราสามารถประกาศ main method ได้ดังนี้:
315+
316+ ``` tut
317+ object Main {
318+ def main(args: Array[String]): Unit =
319+ println("Hello, Scala developer!")
320+ }
321+ ```
0 commit comments