19/09/2018, 15:35
Sử dụng alias trong Ruby
Trong bài viết này, chúng ta sẽ tìm hiểu các vấn đề sau: alias keyword alias_method method aliases và scopes 1. alias keyword Ruby cung cấp alias (bí danh) keyword để xử lý các alias của phương thức và thuộc tính class User def fullname "Nam ...
Trong bài viết này, chúng ta sẽ tìm hiểu các vấn đề sau:
- alias keyword
- alias_method method
- aliases và scopes
1. alias keyword
Ruby cung cấp alias (bí danh) keyword để xử lý các alias của phương thức và thuộc tính
class User def fullname "Nam Dang" end alias username fullname alias name username end u = User.new p u.fullname # => "Nam Dang" p u.username # => "Nam Dang" p u.name # => "Nam Dang"
- Ở đây chúng ta định nghĩa một phương thức fullname của User và chúng ta định nghĩa một username alias cho phương thức này.
- Tiếp theo, ta đặt cho username alias một alias khác là name
- Vì vậy, mỗi lần ta gọi đến name hay username thì nó sẽ gọi lại code trong User#fullname method và trả về cùng một kết quả.
2. alias_method Method
Module#alias_method method chia sẻ cùng hành vi với alias keyword nhưng nó tuân thủ cú pháp method
class User def fullname "Nam Dang" end alias_method :username, :fullname alias_method "name", :username end u = User.new p u.fullname # => "Nam Dang" p u.username # => "Nam Dang" p u.name # => "Nam Dang"
- Giống như alias keyword, ta đinh nghĩa User#fullname method và ta định nghĩa username alias cho method này.
- Sau đó, username alias được đặt lại bằng name alias.
- Vì vậy, mỗi lần gọi đến name, username hay fullname thì ta sẽ nhận được cùng một kết quả.
Chúng ta có thể thấy rằng alias_method method nhận một String hoặc một Symbol làm đối số để xác định alias và method alias.
3. Aliases and scopes
Thực tế, Module#alias_method hoạt động khác với alias keyword trong một phạm vi cụ thể.
class Post def description "I'm a BanKai" end def self.alias_description alias_method :describe, :description end end class Comment < Post def description "Hello! Everybody" end alias_description end m = Comment.new p m.description # => "Hello! Everybody" p m.describe # => "Hello! Everybody"
- Ở đây chúng ta có thể thấy rằng, alias_method được sử dụng trong phương thức Device#alias_description method và định nghĩa describe alias trên Microwave#description method chứ không phải Device#description.
- Bây giờ ta sẽ thử với alias keyword:
class Post def description "I'm a BanKai" end def self.alias_description alias describe description end end class Comment < Post def description "Hello! Everybody" end alias_description end m = Comment.new p m.description # => "Hello! Everybody" p m.describe # => "I'm a BanKai"
- Như vậy với việc sử dụng alias keyword thì describe alias sẽ sử dụng trên Device#description method chứ không phải Microwave#description.