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
  • aliasesscopes

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.
0