11/08/2018, 23:13

2-6 Đối tượng và lệnh

Trong ruby thì [giá trị số] hay [dãy chữ] đều là đối tượng. Và không chỉ thế, trong Ruby, tất cả mọi giá trị đều là đối tượng Sự khác nhau giữa giá trị số và dãy chữ, cách chuyển đổi Từ trước đến nay thì giá trị số và dãy chữ là những khái niệm riêng biệt, nên khi chúng ta viết thế này thì ...

Trong ruby thì [giá trị số] hay [dãy chữ] đều là đối tượng. Và không chỉ thế, trong Ruby, tất cả mọi giá trị đều là đối tượng

Sự khác nhau giữa giá trị số và dãy chữ, cách chuyển đổi

Từ trước đến nay thì giá trị số và dãy chữ là những khái niệm riêng biệt, nên khi chúng ta viết thế này thì chương trình sẽ bị lỗi.

p 1 + "1"	# sẽ có lỗi bị phát sinh

Với ví dụ trên thì có nghĩa ta đang cố gắng cộng số 1 với chữ có nội dung là 1. Tất nhiên việc cộng giữa giá trị số và chữ là không thể xảy ra.

Như vậy ta sẽ sử dụng lệnh [.to_i] để chuyển nội dung chữ thành giá trị số.

p 1 + "1".to_i  # => 2

Khi sử dụng [.to_i] thì chúng ta có thể chuyển nội dung chữ thành giá trị số nên phần code bên trên cũng giống phần code dưới đây.

p 1 + 1     # => 2

Ngược với ví dụ ở trên, chúng ta cũng có thể chuyển giá trị số thành nội dung chữ. Để chuyển như vậy thì sau giá trị số chúng ta viết thêm lệnh [.to_s]

p 12345.to_s	# => "12345"

Như vậy thì dãy số 12345 sẽ chuyển thành dãy nội dung chữ "12345". Như trên, tại Ruby nội dung chữ và giá trị số được phân biệt rất rõ ràng. Vì cách sử dụng cũng khác nhau nên mọi người nên chú ý để không sử dụng nhầm.

Vậy cuối cùng, nội dung chữ với giá trị số cuối cùng nó là cái gì? Chúng ta chuyển đối nó cuối cùng để làm gì. Những câu hỏi này sẽ được giải đáp chi tiết tại phần tiếp theo.

Gọi lệnh cho các đối tượng

Từ trước đến giờ chúng ta gọi những dữ liệu sau đây là giá trị số và nội dung chữ.

1	    # giá trị số
"ABC"	# nội dung chữ

Trong Ruby, những giá trị như giá trị số hay nội dung chữ thì đều được gọi là đối tượng (Object)

1	    # đối tượng số
"ABC"	# đối tượng chữ

Tất nhiên, cách gọi như vậy không làm thay đổi bản chất của nó là giá trị số và nội dung chữ. Những giá trị số hay nội dung chữ, hay một số nội dung khác nữa, trong Ruby đều được gọi là đối tượng.

Mặt khác, như đã nêu ở trên, những nội dung như [.to_i] hay [.to_s] được gọi là lệnh (methods). Đối với đối tượng số hay đối tượng chữ, gắn với nó đều có những lệnh chuyên môn.

Nếu chúng ta muốn thực hiện lệnh mà đối tượng đang mang thì chúng ta phải làm như sau.

object.tên lệnh

Giữa đối tượng và tên lệnh được nối với nhau bằng dấu [.]. Phần đối tượng (Object) thì chúng ta cũng có thể sử dụng biến số thay cho chính Object đó. Nội dung đối tượng được viết bên trái dấu [.] được gọi là [receiver].

Về cơ bản thì chúng được viết như sau.

p "100".to_i	# biểu thị chuyển sang giá trị số
a=100
p a.to_i

Đối với đối tượng là nội dung chữ thì ngoài lệnh [.to_i] thì chúng ta cũng có rất nhiều lệnh khác. Chương trình dưới đây dùng để làm [to chữ lên] và [nhỏ chữ đi].

a = "abc"
p a.upcase	      # => "ABC"
p "ABC".downcase	# => "abc"

Lệnh [upcase] sẽ làm lớn chữ lên, tức chuyển chữ thường thành chữ in hoa, còn lệnh [downcase]sẽ làm nhỏ chữ đi, nghĩa là chuyển chữ in hoa thành chữ thường.

Chúng ta cũng có thể có lệnh [chop] đối với nội dung chữ. Lệnh [chop] sẽ xóa chữ cái cuối cùng của nội dung chữ.

p "ABC".chop	# => "AB"

Lệnh gần giống [chop] là [chomp]. [chomp] chỉ dùng trong trường hợp phần cuối cùng của dãy chữ bị xuống dòng, thì lệnh ra xóa sự xuống dòng đó.

p "ABC".chop	   # => "AB"
p "ABC
".chomp	# => "ABC"

Gọi lệnh liên tục

Tại Ruby thì chúng ta cũng có thể thực hiện cách viết như sau.

p "abc".upcase.chop	# => "AB"

Các lệnh sẽ được thực hiện theo thứ tự. Theo như ví dụ ở trên thì ban đầu lệnh [upcase] sẽ phóng chữ thường thành chữ in hoa, và trả lại nội dung là [ABC]. Sau đó đối với [ABC] thì lệnh [chop] được thực hiện là xóa đi 1 chữ cuối. Vậy nên kết quả cuối cùng sẽ trở thành "AB". Đối với kết quả trên nếu chúng ta cho thêm lệnh [downcase] thì kết quả sẽ trở thành "ab".

p "abc".upcase.chop.downcase	# => "ab"

Viết đè lên biến số

Khi sử dụng lệnh [.to_i] và [.to_s] thì chúng ta cần chú ý vài điểm sau. Hãy xem chương trình dưới đây.

a = "100"
p a.to_i	   # => 100
p a			# => "100"

Tại dòng thứ 2, sau khi chuyển nội dung chữ [a] thì nó đã được biểu thị. Tuy nhiên, tại dòng 3, khi chúng ta biểu thị [a] thì nội dung chữ "100" lại được biểu thị. Thế có nghĩa là nội dung ban đầu không hề được chuyển đổi.

a.to_i

Khi ta viết như vậy, đối với [a] ta thực hiện lệnh [.to_i] nhưng chính [a] vẫn là nội dung chữ. Và chúng ta chỉ gọi lệnh ra thôi. Khi lệnh [.to_i] được gọi ra thì nó sẽ chuyển nội dung chữ thành giá trị số và trả lại kết quả cho ta. Lệnh p tiếp nhận kết quả trả lại đó và hiển thị lên. Chúng ta có thực hiện bao nhiêu lệnh [to_i] đi chăng nữa thì giá trị mà a đang mang cũng sẽ không bao giờ thay đổi.

Nếu chúng ta muốn đổi chính bản thân [a] từ nội dung chữ thành số thì chúng ta cần làm như sau:

a = "100"
a = a.to_i
p a

Như vậy chúng ta đã viết đè lên a và chuyển nó thành [a.to_i]. Khi làm thế này thì ta đã chuyển nội dung của chính bản thân a.

Nếu trong một dãy kí tự có cả số mà ta thực hiện lệnh [.to_i] thì sẽ trở nên như thế nào?

Mọi người có biết trong một dãy kí hiệu trong đó có cả nội dung chữ lẫn giá trị số mà ta dùng lệnh [to_i] thì kết quả trả về sẽ là gì không? Kết quả sẽ được hiển thị như sau.

p "ABC".to_i	  # => 0
p "12ABC".to_i	# => 12
p "ABC12".to_i	# => 0

Khi thực hiện lệnh [to_i] đối với một dãy bao gồm cả chữ lẫn số thì về cơ bản chúng sẽ trả về kết quả là 0. Nhưng chỉ trong trường hợp đầu dãy là số thì kết quả trả về sẽ là số đó.

0