Crystal tut 1: Làm quen với Crystal - Hello World!
Series bài hướng dẫn cơ bản về học ngôn ngữ lập trình Crystal. Bài 1 này sẽ hướng dẫn làm quen với Crystal, nhập xuất trên màn hình (I/O) với Crystal.
Giới thiệu Crystal
Ưu điểm Crystal
- Crytal là ngôn ngữ biên dịch. https://crystal-lang.org/
- Cú pháp của Crystal gần giống với Ruby, dễ học dễ viết.
- Performance tốt: tốc độ chạy + memory. Nhiều bài benchmark đã công nhận.
- Bộ thư viện chuẩn hỗ trợ khá nhiều tác vụ phổ biến trong lập trình như đọc ghi file, xử lý chuỗi, …
Nhược điểm Crystal
- Thời gian biên dịch chậm (vài giây cho 1 chương trình?). Issue thảo luận: https://github.com//crystal-lang/crystal/issues/4864
- Ít bài hỏi đáp trên Stackoverflow nên hơi khó trong việc tìm kiếm. Keyword tim kiếm: crystal lang.
- Chưa release phiên bản 1.0 (phiên bản hiện tại: 0.24.2).
Vậy: Crystal phù hợp cho viết các chương trình xử lý nhỏ, ứng dụng web cần hiệu suất cao.
Hello World
hello_world.cr
p "Hello World!"
Biên dịch code Crystal thành file thực thi (trên Linux):
$ crystal build hello_world.cr
Biên dịch và chạy chương trình Crystal trong 1 câu lệnh:
$ crystal run hello_world.cr
Chú thích / Comment trong Crystal
Ký tự #
dùng để chú thích cho 1 dòng lệnh, và Crystal mới chỉ hỗ trợ chú thích code cho 1 dòng, chưa thể chú thích code cho 1 block.
p "Hello World!"
# The equivalent command is: puts "Hello World!"
Nhập xuất trong Crystal (I/O)
Ta hãy bắt đầu với 1 chương trình đơn giản sau:
Code 1: Chương trình cho phép người dùng nhập vào tên, sau đó in ra "Hello" + tên người đó.
hello_user.cr
print "Enter your name: "
name = gets.not_nil!
p "Hello " + name
Chạy thử chương trình:
$ crystal run hello_user.cr
Enter your name: Minh
"Hello Minh"
- Lệnh print để chuỗi không có ký tự xuống dòng.
- Lệnh puts / p sẽ in chuỗi và xuống dòng.
- not_nil! sau gets để báo với trình biên dịch rằng input nhập vào chắc chắn không Nil. Nếu không sẽ báo lỗi lúc runtime. Tham khảo: https://crystal-lang.org/api/Nil.html.
Code 2: Chương trình cho phép người dùng nhập vào hai số nguyên, sau đó tính toán và in ra các kết quả sau: tổng, hiệu, tích, thương và chuỗi ghép 2 số đó.
hello_number.cr
print "Enter the first number A: "
num1 = gets.not_nil!
print "Enter the second number B: "
num2 = gets.not_nil!
# convert string to integer
num1 = num1.to_i(strict: false) # num1 = num1.to_i <-- you should try this :)
num2 = num2.to_i(strict: false) # num2 = num2.to_i <-- you should try this :)
s = num1 + num2
p "A + B = " + s.to_s
m = num1 - num2
p "A - B = " + m.to_s
p "A * B = " + (num1 * num2).to_s
p "A / B = " + (num1 / num2).to_s
p "AB = " + num1.to_s + num2.to_s
Chạy chương trình Crystal trên:
$ crystal run hello_number.cr
Enter the first number A: 5
Enter the second number B: 2
"A + B = 7"
"A - B = 3"
"A * B = 10"
"A / B = 2"
"AB = 52"
- Việc covert từ chuỗi sang số nguyên có thể thực hiện dễ dàng bằng phương thức to_i. Nếu ta đặc tả strict: true thì chuỗi convert phải thỏa là số nguyên (chặt chẽ), trường hợp chuỗi có dạng số thực: "2.5", "1.333", … sẽ báo lỗi lúc thực thi. Việc chỉ định tham số strict: false sẽ cho phép ta convert chuỗi có format số thực thành số nguyên. Ví dụ: "2.5" –> 2, "1.333" –> 1.
- Convert ngược lại từ số hoặc kiểu dữ liệu khác sang chuỗi thật dễ dàng, chỉ cần dùng .to_s sau tên biến.
Tất cả script Crystal của các tutorial mình sẽ tổng hợp trên Github tại đường dẫn sau:
https://github.com/minhng92/crystal-examples
Crystal Tutorials: