Nhập môn Ruby

Có lẽ đối với những bạn lập trình viên hay người đã từng học IT thì việc hiểu và học 1 ngôn ngữ lập trình là không quá khó khăn, nhưng đối với 1 người mới làm quen với IT như mình thì thật sự để hiểu tại sao khi viết câu lệnh này lại cho ra kết quả như vậy và ghi nhớ cách viết cũng mất khá nhiều thời gian. Mình đang bắt đầu học Ruby, ai cũng nói nó dễ lắm, vậy mà có những chỗ mình vẫn không hiểu 😦 . Vì vậy mình đã tìm hiểu bài viết tổng hợp về nhập môn Ruby trên trang Quiita và quyết định dịch lại để ghi nhớ và hy vọng có ích cho bạn nào cũng đang ở tình trạng giống như mình.

Nguồn bài viết: Ruby入門(ドットインストール)

Bắt đầu

Đây là bài tổng hợp các bài về nhập môn Ruby trên trang ドットインストール

Mục lục

  • Bang method, method trả về giá trị đúng sai
  • Hãy dùng thử kí hiệu %
  • Hãy dùng thử if để phân chia điều kiện
  • Giá trị đúng sai và toán tử điều kiện
  • Hãy dùng thử case để phân chia điều kiện
  • Dùng times, while, break, next
  • Dùng for, each
  • Hãy thử tạo method về hàm số
  • Hãy thử tạo class
  • Dùng class method và class biến số
  • Hãy thử kế thừa class
  • Hãy dùng thử accessor
  • Hãy dùng thử time class

Nội dung

1. Bang method, method trả về giá trị đúng sai

1.1 Bang method

  • Method dùng trong trường hợp muốn viết lại dữ liệu ban đầu
#Thông thường
  s = "taguchi"
  puts s.upcase
  puts s
#Kếtquả
TAGUCHI
taguchi
#Trường hợp dùng bang method
s = "taguchi"
puts s.upcase!
puts s
#Kết quả
TAGUCHI
TAGUCHI

1.2 Method trả về giá trị đúng sai

  • Method dùng trong trường hợp muốn trả về giá trị đúng sai ở kết quả
  • Giá trị đúng sai của kết quả được dùng trong logical operation và phán đoán điều kiện
 s = "taguchi"
p s.empty?
#Kết quả
false
s = ""
p s.empty?
#Kết quả
true

2. Hãy dùng thử kí hiệu %

Kí hiệu % là gì

  • Cách viết khác của string và array
#Cách viết thông thường
+String
s = "hello"
s = 'hello'
+Array
a = ["a", "b", "c"]
a = ['a', 'b', 'b']
#Cách viết dùng kí hiệu %
+String
s = %Q(hello)
s = %q(hello)
+Array
a = %W(a b c)
a = %w(a b c)
#Có thể dùng bất cứ kí hiệu nào để đóng string như (!, [, {,..)

3. Hãy dùng thử if để phân chia điều kiện

Phân chia điều kiện

#Cách viết thông thường
score = 50
if score > 60
  puts "OK!"
elsif score == 60
  puts "NG!"
else
  puts "SOSO..."
end
#=>SOSO...
#Cách viết giản lược
score = 50
puts "OK!" if score > 40
#=>OK!

4. Giá trị đúng sai và toán tử điều kiện

4.1 Giá trị đúng sai

  • Trường hợp false

    false hoặc nil(Oject không tồn tại)

  • Trường hợp true

    Các trường hợp còn lại(bao gồm 0, ' ')

#Dùng if để phân chia điều kiện theo giá trị đúng sai
 x = 10
if x
 puts "True"
end
#Phía trên là phần giản lược của toán tử so sánh phía dưới
if x == true
  puts "True"
end

4.2 Toán tử điều kiện

Để viết câu lệnh if else đơn giản hơn

#Câu lệnh  if else dựa vào toán tử điều kiện

b, c = 10, 20  #gán nhiều giá trị
a = b > c ? c : b
puts a

Kết quả
20

5. Hãy dùng thử case để phân chia điều kiện

 #Phân chia điều kiện bằng câu lệnh case

signal = "red"
case signal
  when "red"
    puts "STOP!"
  when "green", "blue"  # Có thể chỉ định nhiều giá trị bằng cách dùng dấu , ngăn cách
    puts "GO!"
  when "yellow"
    puts "CAUTION!"
  else
    puts "wrong signal"
end
#Kết quả
STOP!

6. Dùng times、while、break、next

#time method
3.times do |i|    #Nếu thêm biến số thích hợp vào sau do thì sẽ có được số vòng lặp
 puts "#{i}: hello"
end
#Kết quả
0: hello
1: hello
2: hello
#while method
i = 0
while i > 3 do
  puts "#{i}: hello"
end
#Kết quả
0: hello
1: hello
2: hello
#times+break
3.times do |i|    #Nếu thêm biến số thích hợp vào sau do thì sẽ có được số vòng lặp

  if i == 1
    break
  end
  puts "#{i}: hello"
end
#Kết quả
0: hello
#times+next
3.times do |i|    # Nếu thêm biến số thích hợp vào sau do thì sẽ có được số vòng lặp

  if i == 1
    next
  end
  puts "#{i}: hello"
end
#Kết quả
0: hello
2: hello

7. Dùng for、each

# Câu lệnh for
for i in 0..2
 puts i
end
#Kết quả
0
1
2
#Câu lệnh for (Array)
for color in ["red", "blue", "pink"]
  puts color
end
#Kết quả
red
blue
pink
#Câu lệnh each(Array)
["red", "blue", "pink"].each do |color|
  puts color
end
#Kết quả
red
blue
pink
# Câu lệnh each (hash)
{"apple"=>100, "banana"=>200, "orange"=>50}.each do |fruit, price|
  puts "#{fruit}: #{price}"
end
#Kết quả
apple: 100
banana: 200
orange: 50

8. Hãy thử tạo method về hàm số

#Tạo hàm số
def sayHi
  puts "Hello"
end

sayHi()

#Kết quả
Hello
#Thêm tham số
def sayHi(name)
  puts "Hello" + name
end

sayHi("Tom")
#Kết quả
Hello Tom
#Thiết lập giá trị cố định cho tham số
def sayHi(name = "Steve")
  puts "Hello" + name
end

sayHi("Tom")
sayHi()
#Kết quả
Hello Tom
Hello Steve
#Lấy giá trị quay lại
def sayHi(name)
  s = "Hello" + name
  return s    #return có thể lược bỏ
end

greet = sayHi("Tom")    #Vì có giá trị quay lại nên có thể gán
 puts greet
puts s    #Không thể gọi dữ liệu từ ngoài method đã được định nghĩa
#Kết quả
Hello Tom
Error

9. Hãy thử tạo class

Một số thuật ngữ

+Class: Là bản thiết kế object

+Instance :Là object được tạo ra từ class

+Biến số instance : Là biến số bắt đầu bởi @ và có thể gọi ra từ method khác bên trong instance

#Ví dụ1
class User()
  def initialize(name)
    @name = name
  end

  def sayHi()
    puts "Hello, my name is #{@name}"
  end
end

tom = User.new("Tom")
bob = User.new("Bob")

tom.sayHi()
bob.sayHi()
#Kết quả
Hello, my name is Tom
Hello, my name is Bob

10. Dùng class method và biến số class

Một số thuật ngữ

+Instance method : Là method được định nghĩa thông thường trong class

+Class method: Là method có thể được gọi ra trực tiếp từ class

+Biến số class : Là biến số bắt đầu bở[email protected]@ và là biến số có thể gọi ra từ class method

#Class method, biến số class
class User()

  @@count = 0    #Biến số class

  def initialize(name)
    @name = name    #Biến số instance
    @@count += 1
  end

  def sayHi()    #Instance method
    puts "Hello, my name is #{@name}"
  end

  def User.sayHello    #Class method
    puts "Hello from User class (#{@@count} users)"
  end
end

User.sayHello()

tom = User.new("Tom")
bob = User.new("Bob")

User.sayHello()
#Kết quả
Hello from User class (0 users)
Hello from User class (2 users)

11.Hãy thử kế thừa class

#Kế thừa class
class User()
  def initialize(name)
    @name = name    # Biến số instance
  end

  def sayHi()    # instance method
    puts "Hello, my name is #{@name}"
  end
end

class SuperUser < User
  def shout
    puts "HELLO! from #{@name}!"
  end
end

tom = User.new("Tom")
bob = SuperUser.new("Bob")

tom.sayHi()
bob.sayHi()
bob.shout()
#Kết quả
Hello, my name is Tom
Hello, my name is Bob
HELLO! from Bob

12. Hãy dùng thử accessor

Một số thuật ngữ Accessor

+Lấy giá trị thiết lập: getter

+Thay đổi thiết lập: setter

@Định nghĩa setter, getter
class User()
  def initialize(name)
    @name = name    # biến số instance
  end

  # Dùng getter, setter trong trường hợp muốn gọi hay thay đổi biến số instance từ bên ngoài
  # getter
  def name
    @name    # return trong return @name có thể lược bỏ
  end

  # setter
  def setName(newName)
    @name = newName
  end

  def sayHi()    # instance method
    puts "Hello, my name is #{@name}"
  end
end

bob = User.new("Bob")
bob.sayHi()
p bob.name
bob.setName("Tom")
bob.sayHi()
#Kết quả
Hello, my name is Bob
"Bob"
Hello, my name is Tom

Có thể viết đơn giản như thế này

#Định nghĩa setter, getter
class User()
  def initialize(name)
    @name = name    # biến số instance
  end

  # Định nghĩa cả getter, setter
  attr_accessor :name
  # Chỉ định nghĩa getter
  attr_reader :name
  # Chỉ định nghĩa setter
  attr_writer :name

  def sayHi()    # instance method
    puts "Hello, my name is #{@name}"
  end
end

bob = User.new("Bob")
bob.sayHi()
p bob.name
bob.name = "Tom"  # Có thể viết như thế này
bob.sayHi()
#Kết quả
Hello, my name is Bob
"Bob"
Hello, my name is Tom

13. Hãy dùng thử time class

#Lấy điểm thời gian hiện tại
t = Time.now
p t
#Kết quả
2016-03-20 13:09:30 +0900
#Chỉ định thời gian và tính toán thời gian
t = Time.new(2016, 3, 20, 13, 09, 30)
p t
t += 10
p t
#Kết quả
2016-03-20 13:09:30 +0900
2016-03-20 13:09:40 +0900
#Thay đổi cách hiển thị
t = Time.new(2016, 3, 20, 13, 09, 30)
p t.strftime("Updated: %Y-%m-%d")
p t
#Kết quả
"Updated: 2016-03-22"

Hy vọng bài tổng hợp này có thể giúp ích được cho bạn nào mới học Ruby như mình!