Chương trình Scala đầu tiên
Nhập nó vào vỏ.
$ thang đo
scala> 1 + 1 res0: Int = 2 scala> println("Xin chào thế giới!") Xin chào thế giới!
định dạng tập tin.
object HelloWorld { /* Đây là chương trình Scala đầu tiên của tôi* Chương trình sau sẽ xuất ra 'Hello World!' */ def main(args: Array[String]) = { println("Hello, world!") // Output Hello World } }
Tiếp theo chúng ta biên dịch nó bằng lệnh scalac:
$ scalac HelloWorld.scala $ ls HelloWorld$.class HelloWorld.scala HelloWorld.class
Sau khi biên dịch, chúng ta có thể thấy tệp HelloWorld.class được tạo trong thư mục, có thể chạy trên Máy ảo Java (JVM).
Sau khi biên dịch, chúng ta có thể thực thi chương trình bằng lệnh sau:
$ scala HelloWorld Xin chào thế giới!
ngữ pháp cơ bản
Scala là một ngôn ngữ chạy trên JVM. Nó chắc chắn giống với Java về cú pháp và khái niệm, đồng thời cú pháp của Java cũng giống như cú pháp C, vì vậy nếu bạn có nền tảng C thì cú pháp cơ bản tương đối dễ hiểu. bắt đầu với.
Scala có hai triết lý thiết kế: hướng đối tượng (OOP) và lập trình chức năng (FP).
Hướng đối tượng có nghĩa là mọi thứ trong Scala đều là một đối tượng; khái niệm về phong cách chức năng tương đối xa lạ và sẽ được giới thiệu riêng sau.
1.Biến
Sử dụng từ khóa “var” để khai báo biến và từ khóa “val” để khai báo hằng.
Ví dụ khai báo biến như sau:
var myVar : String = "Foo" var myVar : String = "Too"
Scala là ngôn ngữ được gõ tĩnh, nhưng trình biên dịch có thể tự động suy ra các kiểu.
Vì vậy, phần trên có thể được viết như thế này và hiệu quả sẽ giống nhau:
var myVar = "Foo" var myVar = "Quá"
2. Kiểu dữ liệu
Tuy nhiên, chúng tôi nói rằng scala là ngôn ngữ trong đó mọi thứ đều là đối tượng và các biến này đều là đối tượng.
Điều này tương tự với lớp đóng gói trong java (việc triển khai cơ bản của Scala cũng sử dụng lớp đóng gói của java).
Scala có các kiểu dữ liệu giống như Java Bảng sau liệt kê các kiểu dữ liệu được Scala hỗ trợ:
kiểu dữ liệu |
mô tả |
Byte |
Số nguyên bù hai có dấu 8 bit. Phạm vi giá trị là -128 đến 127 |
Ngắn |
Số nguyên bù hai có dấu 16-bit. Phạm vi giá trị là -32768 đến 32767 |
Int |
Số nguyên bù hai có dấu 32-bit. Phạm vi giá trị là -2147483648 đến 2147483647 |
Dài |
Số nguyên bù hai có dấu 64-bit. Phạm vi giá trị là -9223372036854775808 đến 9223372036854775807 |
Trôi nổi |
Số dấu phẩy động có độ chính xác đơn tiêu chuẩn 32-bit, IEEE 754 |
Gấp đôi |
Số dấu phẩy động có độ chính xác kép tiêu chuẩn IEEE 754 64-bit |
Char |
Ký tự Unicode không dấu 16 bit, từ U+0000 đến U+FFFF |
Sợi dây |
chuỗi ký tự |
Boolean |
đúng hay sai |
Đơn vị |
Cho biết không có giá trị, tương đương với void trong các ngôn ngữ khác. Được sử dụng làm loại kết quả cho các phương thức không trả về kết quả. Đơn vị chỉ có một giá trị mẫu, được viết là (). |
Vô giá trị |
tham chiếu rỗng hoặc rỗng |
Không có gì |
Kiểu Nothing nằm ở cuối hệ thống phân cấp lớp của Scala; nó là kiểu con của bất kỳ kiểu nào khác. |
Bất kì |
Any là siêu lớp của tất cả các lớp khác |
Bất kỳ tham chiếu |
Lớp AnyRef là lớp cơ sở cho tất cả các lớp tham chiếu trong Scala |
Các kiểu dữ liệu được liệt kê trong bảng trên đều là đối tượng, điều đó có nghĩa là scala không có kiểu gốc trong java. Trong Scala, bạn có thể gọi các phương thức trên các kiểu cơ bản như số.
(1) Ký tự nguyên, ký tự dấu phẩy động
nhẹ nhàng.
(2) Chuỗi ký tự
scala> '1' res0: Char = 1 scala> "1" res1: String = 1 scala> "\t" res2: String = " " scala> """\t""" res3: String = \t
Nội suy chuỗi đánh giá từng biểu thức và gọi phương thức toString.
scala> val a=2.1 a: Double = 2.1 scala> val s=s"Xin chào,${a+9}!" s: String = Xin chào,11.1!
chức năng
định nghĩa phương pháp
Định nghĩa phương thức bắt đầu bằng từ khóa def, theo sau là danh sách tham số tùy chọn, dấu hai chấm: và kiểu trả về của phương thức, dấu bằng = và cuối cùng là phần thân của phương thức.
Định dạng định nghĩa phương thức Scala như sau:
def functionName ([danh sách tham số]) : [kiểu trả về] = { nội dung hàm trả về [expr] }
- Trong đoạn mã trên kiểu trả về Có thể là bất kỳ loại dữ liệu Scala hợp pháp nào. Các tham số trong danh sách tham số có thể được phân tách bằng dấu phẩy.
Lạc đề: Scala có thể sử dụng các bộ dữ liệu để đóng gói, trả về nhiều biến cũng như giải cấu trúc và gán giá trị khi gọi.
scala> def useScala() = (1,2,3) useScala: ()(Int, Int, Int) 。
scala> val a,b,c = useScala() a: (Int, Int, Int) = (1,2,3) b: (Int, Int, Int) = (1,2,3) c: (Int, Int, Int) = (1,2,3) 。
- Nên bỏ qua phần return ở dòng cuối cùng của thân hàm.
- Dấu bằng "=" bỏ qua điều kiện: kiểu trả về không được khai báo rõ ràng và kiểu trả về là Unit. Điều này tương tự như void của Java.
đối tượng Hello{ def printMe( ){ println("Xin chào, Scala!") } }
gọi phương thức
Sau đây là định dạng chuẩn cho các phương thức gọi:
functionName(danh sách tham số)
Nếu phương thức được gọi bằng cách sử dụng một đối tượng thể hiện, chúng ta có thể sử dụng định dạng giống Java (sử dụng ký hiệu .):
[instance.]functionName(danh sách tham số)
lớp và đối tượng
Một lớp là sự trừu tượng hóa của một đối tượng và một đối tượng là một thể hiện cụ thể của một lớp. Các lớp là trừu tượng và không chiếm bộ nhớ, trong khi các đối tượng là cụ thể và chiếm không gian lưu trữ. Lớp là một bản thiết kế chi tiết để tạo các đối tượng, một mẫu phần mềm xác định các phương thức và biến có trong một đối tượng thuộc một loại cụ thể.
class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x Điểm tọa độ của: " + x); println ("Điểm tọa độ của y: " + y); } }
Người xây dựng
-
Phương pháp thi công chính.
Tất cả các phần không phải trường và không phải phương thức trong lớp đều được coi là hàm tạo và danh sách tham số sau tên lớp được sử dụng để nhận nó.
Bạn có thể xem cách SpinalHDL tạo verilog:
đối tượng MyTopLevelVerilog mở rộng App { Config.spinal.generateVerilog(MyTopLevel(4)) }
Xem định nghĩa ứng dụng:
trait App mở rộng DelayedInit { // ... @deprecatedOverriding("main không nên bị ghi đè", "2.11.0") def main(args: Array[String]) = { this._args = args for (proc <- initCode) proc() if (util.Properties.propIsSet("scala.time")) { val total = currentTime - executionStart Console.println("[total " + total + "ms]") } } }
-
Trình xây dựng phụ trợ.
định nghĩa điều này( ... ) 。
Câu đầu tiên trong hàm phải gọi các hàm tạo khác this().
-
Nhà xây dựng chính riêng tư.
Nếu riêng tư được thêm vào như trong ví dụ, đối tượng không thể được tạo thông qua phương thức khởi tạo chính khi xây dựng đối tượng và phải sử dụng hàm tạo phụ hoặc phương thức xuất xưởng (phương thức được sử dụng để xây dựng đối tượng).
lớp Student private (tên: String,n: Int)
Kế thừa lớp
mở rộng từ khóa.
lớp Child mở rộng Parent{ //... }
Đối tượng nhà máy và phương thức nhà máy
Nếu bạn xác định một phương thức được sử dụng cụ thể để xây dựng các đối tượng của một lớp nhất định thì phương thức này được gọi là "phương thức xuất xưởng". Một đối tượng đơn lẻ chứa tập hợp các phương thức xuất xưởng này được gọi là "đối tượng xuất xưởng". Thông thường, các phương thức xuất xưởng được xác định trong các đối tượng đồng hành. Đặc biệt khi một loạt các lớp có mối quan hệ kế thừa, một loạt các phương thức xuất xưởng tương ứng có thể được định nghĩa trong đối tượng đồng hành của lớp cơ sở. Ưu điểm của việc sử dụng phương thức xuất xưởng là bạn không cần sử dụng trực tiếp new để khởi tạo đối tượng mà thay vào đó sử dụng các lệnh gọi phương thức và tên phương thức có thể tùy ý, do đó ẩn các chi tiết triển khai của lớp từ bên ngoài.
//students. scala class Students(val name:String,var score:Int){ def exam(s:Int)=score =s override def toString =name +"'s score is "+score +"." } object Students { def registerStu(name:String,score:Int)=new Students(name,score) } //registerStu为工厂方法
Sau khi nhập đối tượng singleton bằng "import Students._", bạn có thể sử dụng nó như sau:
scala>import Students._ scala>val stu =registerStu("Tim",100) stu:Students =Điểm của Tim là 100.
Phương pháp ghi đè
Thêm từ khóa ghi đè vào trước hàm.
Ghi đè phương thức toString.
lớp A { ghi đè def toString = "123456A" } val a = new A() println(a)
scala> lớp A { | ghi đè def toString = "123456A" | } // lớp A đã định nghĩa scala> val a = new A() val a: A = 123456A scala> println(a) 123456A
Đối tượng đơn Scala
Trong Scala không có cái gọi là tĩnh nhưng nó cũng cung cấp cho chúng ta phương thức triển khai chế độ singleton, đó là sử dụng từ khóa object.
Khi sử dụng chế độ singleton trong Scala, ngoài lớp được xác định, một đối tượng đối tượng có cùng tên cũng phải được xác định. Điểm khác biệt giữa nó và một lớp là đối tượng đối tượng không thể lấy tham số.
Khi một đối tượng đơn lẻ có cùng tên với một lớp, nó được gọi là đối tượng đồng hành của lớp này: đối tượng đồng hành. Bạn phải định nghĩa lớp và các đối tượng đồng hành của nó trong cùng một tệp nguồn. Lớp này được gọi là lớp đồng hành của đối tượng đơn lẻ này: lớp đồng hành. Một lớp và các đối tượng đồng hành của nó có thể truy cập các thành viên riêng tư của nhau.
lớp Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy } } đối tượng Test { def main(args: Array[String]) { val point = new Point(10, 20) printPoint def printPoint{ println ("x tham số : " + point.x); println ("y tham số : " + point.y); } } }
Thực thi đoạn mã trên, kết quả đầu ra là:
$ scalac Test.scala $ scala Kiểm tra x điểm tọa độ: 10 điểm tọa độ y: 20
đối tượng đồng hành
// Lớp hàm tạo riêng Marker private(val color:String) { println("Create" + this) ghi đè def toString(): String = "Color mark:"+ color } // Đối tượng đồng hành, giống như tên lớp, có thể Truy cập các thuộc tính và phương thức riêng tư của đối tượng lớp Marker{ Private val marker: Map[String, Marker] = Map( "red" -> new Marker("red"), "blue" -> new Marker("blue") , " màu xanh lá" -> new Marker("green") ) def apply(color:String) = { if(markers.contains(color)) marker(color) else null } def getMarker(color:String) = { if(markers.contains( color)) marker(color) else null } def main(args: Array[String]) { println(Marker("red")) // Lệnh gọi hàm Singleton, bỏ ký hiệu .(dot) println(Marker getMarker "blue") } }
Toán tử là các phương thức
-
toán tử tiền tố.
Chỉ +, -, ,! tồn tại và tên phương thức tương ứng là unary_+, unary_-, unary_, unary_.
2. Toán tử trung tố và hậu tố.
Toán tử kết thúc bằng dấu hai chấm, toán tử bên phải là đối tượng gọi.
Cuối cùng, bài viết này về [2] Hướng dẫn SpinalHDL - Giới thiệu đơn giản về Scala kết thúc tại đây. Nếu bạn muốn biết thêm về [2] Hướng dẫn SpinalHDL - Giới thiệu đơn giản về Scala, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các Bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!