+6

Bang Methods (!) trong Ruby

Nếu bạn là một người mới học Ruby, thì chắc chắn bạn sẽ gặp dấu (!) được đặt cùng một phương thức nào đó. Nếu đặt ở đầu phương thức thì đơn giản chỉ là phủ định như các ngôn ngữ lập trình phổ biến khác, còn được đặt ở cuối một method thì sẽ thế nào, bài viết này sẽ giúp bạn hiểu được điều đó.

1. Bang Methods là gì ?

Methods Bang được sử dụng khi kết thúc phương thức bằng dấu chấm than ! (bang). Ví dụ như upcase! compact!.Chắc hẳn bạn từng một lần bị nhận cảnh báo : "Warning!", có thể là đi đường hay một bộ phim nào đó. Bang trong Ruby cũng được xem như một phương thức nguy hiểm, vì khi sử dụng nó sẽ thực hiện và sửa đổi đối tượng kết quả trả về đối tượng đã sửa đổi. Càng nguy hiểm sẽ càng thú vị phải không nào, vậy không có lí do gì để bỏ qua bang.

2. Bang Methods trả lại đối tượng đã sửa đổi.

Không phải tất cả các phương thức đều có thế sử dụng với bang, hầu hết các phương thức thực hiện rồi trả về đối tượng mới đều không thể sử dụng với bang. Để sử dụng bang ta phải đảm bảo quá trình thực hiện sửa đổi đó trên cùng một đối tượng. Nếu đã sử dụngbang thì có thể sử dụng non-bang, sự khác nhau là bang thực hiện và sửa đổi đối tượng còn non-bang chỉ dừng lại ở thực hiện. Bắt đầu với một vài ví dụ cho dễ hiểu:

Sử dụng non-bang để xin chào thế giới

name = "Hello, World"
puts name.upcase
puts name

Kết quả :

HELLO, WORLD
Hello, World

Sử dụng bang

name = "Hello, World"
puts name.upcase!
puts name

Kết quả

HELLO, WORLD
HELLO, WORLD

Dễ dàng nhận thấy sự khác biệt của bangnon-bang, bang thực hiện hành động rồi sửa đổi đối tượng còn với non-bang thì chỉ dừng ở thực hiện hành động. Tuy nhiên khi sử dụng bang biến name trước và sau khi sửa đổi liệu có cùng một đối tượng hay không? Dùng oject_id để giải quyết điều này. Nếu bạn muốn tìm hiểu kĩ hơn về ojbect_id thì có thể tìm đọc các bài viết chất lượng ngay tại Viblo. Ở đây tôi chỉ nhắc lại những thứ cơ bản về object_id thông qua ví dụ sau:

a = "123"
puts a.object_id
puts "---------------"
a = "123"
puts a.object_id

Kết quả

46931933723760
---------------
46931933723580

Như bạn có thể thấy, có 2 đối tượng giống hệt nhau về mặt trực quan, nhưng chúng có object_id khác nhau, cho chúng ta biết rằng các đối tượng này khác nhau và được lưu trữ ở những nơi khác nhau. Quay trở lại vấn đề chính, ta sẽ đi kiểm tra đối tượng sau khi bang qua ví dụ:

string = "I love Framgia"

puts "Initial value of string: #{string}"
puts "Object id of string: #{string.object_id}"

string.gsub!(/Framgia/, "Sun Asterisk")

puts "Object id of string: #{string.object_id}"
puts "Value of string: #{string}"

Kết quả

Initial value of string: I love Framgia
Object id of string: 47356345589720
Object id of string: 47356345589720
Value of string: I love Sun Asterisk

Như vậy chúng cùng một id_object, nên bang sửa đổi trên cùng một đối tượng

3. Bang Methods có thể trả về nil

puts "ruby".upcase!
puts "RUBY".upcase!

Kết quả

RUBY
=> nil

Như bạn có thể thấy, trong trường hợp thứ hai, chúng ta có giá trị là nil. Điều này là do chuỗi ruby, tất cả các ký tự đã được viết bằng chữ in hoa và upcase! không biết phải làm gì. Đó là lý do tại sao có thể có những tình huống khi một biểu thức có điều kiện bạn nhận được nil và điều kiện sẽ hoạt động theo cách không mong muốn.

4. Tổng kết

Qua bài viết này, bạn có thể hiểu cơ bản về Methods Bang, làm chủ được những nguy hiểm của bang, và cách sử dụng bangnon-bang sao cho phù hợp. Đây là lần đầu tiên mình dịch và viết bài, nên có gì sai sót cả về kĩ thuật hành văn hay ví dụ, mong các bạn sẽ góp ý để mình hoàn thiện hơn.

Tham khảo :

https://medium.com/@sologoubalex/bang-methods-in-ruby-60356cc5aeb6 http://ruby-for-beginners.rubymonstas.org/objects/bangs.html


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.