Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách sử dụng từ khóa bí danh Ruby

Bạn có thể đặt một tên thay thế cho một phương thức Ruby theo hai cách:

  • bí danh (từ khoá)
  • alias_method

Vì họ làm cùng một việc theo những cách hơi khác nhau nên đây có thể là một chủ đề khó hiểu.

Hình ảnh này là bản tóm tắt về sự khác biệt :

Cách sử dụng từ khóa bí danh Ruby

Hãy cùng khám phá những điểm khác biệt này một cách chi tiết hơn để hiểu rõ hơn!

Từ khóa bí danh

Đầu tiên chúng ta có alias , là một từ khóa Ruby (như if , def , class , v.v.)

Có vẻ như thế này :

alias print_something puts

print_something 1

Hiện đang gọi print_something giống như cách gọi puts .

alias là một từ khóa nó có một số thuộc tính thú vị :

  • Nó có cú pháp đặc biệt
  • Nó có thể được sử dụng ở bất kỳ đâu trong mã của bạn
  • Nó có thể bí danh là các biến toàn cục (không làm như vậy!)

Các dạng bí danh hợp lệ là :

  • bí danh a b
  • bí danh:a:b
  • bí danh:”# {}”:b

Lưu ý rằng không có dấu phẩy giữa các đối số giống như trong một phương pháp thông thường.

Ruby mong đợi cả a &b là tên phương thức hợp lệ, các biến không hoạt động ở đây. Nếu bạn muốn sử dụng các biến, bạn sẽ phải làm như thế này…

Ví dụ :

a = :print_something
b = :puts

alias :"#{a}" :"#{b}"

Nhưng điều này trông xấu xí, vì vậy bạn có thể muốn sử dụng alias_method cho tên phương thức động.

Phương pháp alias_method

Tiếp theo:

Chúng tôi có alias_method , là một phương thức được xác định trên Module .

Bạn chỉ có thể sử dụng phương thức này ở cấp độ lớp &mô-đun, nhưng không thể sử dụng phương thức bên trong phiên bản.

Đây là mô tả từ tài liệu :

alias_method:“Makes new_name một bản sao mới của phương thức old_name . Điều này có thể được sử dụng để duy trì quyền truy cập vào các phương thức bị ghi đè. ”

Ví dụ :

class Foo
  alias_method :print_something, :puts
end

Đây sẽ là bí danh print_something thành puts bên trong Foo .

Bạn có thể sử dụng chuỗi làm alias_method đối số.

Ví dụ :

class Foo
  alias_method "print_something", "puts"
end

alias vs alias_method

Bạn đã thấy tổng quan về alias &alias_method .

Nhưng khi nào thì sự khác biệt phát huy tác dụng?

  1. Khi bạn xác định bí danh cho tên phương thức được tạo động (như “abc # {rand}”)
  2. Khi bạn xác định bí danh bên trong một phương thức

Có thể xác định bí danh cho tên phương thức được tạo động với alias từ khóa nhưng bạn phải sử dụng các ký hiệu nội suy.

Với alias_method bạn nhận được các đối số linh hoạt hơn.

Ví dụ :

class Cat
  def speak
    "meow"
  end

  alias_method "#{name.downcase}_speak", :speak
end

p Cat.new.cat_speak
# "meow"

Bây giờ :

Nếu bạn muốn xác định bí danh bên trong một phương thức, bạn sẽ gặp lỗi này:

undefined method 'alias_method' for # (NoMethodError)

Bởi vì bạn đang làm việc trong một đối tượng chứ không phải một lớp!

Bên trong một phương thức phiên bản, bạn không có quyền truy cập vào các phương thức được xác định trong Module , đó là nơi alias_method được xác định.

Đây là một giải pháp khả thi :

def enable_aliased_methods
  self.class.send(:alias_method, :x, :testing)
end

Sử dụng alias :

def enable_aliased_methods
  alias :x :testing
end

Một điểm khác biệt quan trọng:

  • Một phương thức được xác định bởi alias sẽ thuộc về lớp mà alias được sử dụng
  • Một phương pháp được xác định bởi alias_method sẽ thuộc về self , lớp hiện tại tại thời điểm mã được chạy

Đây là lý do tại sao điều đó quan trọng:

Nếu bạn gọi một phương thức trên lớp cha sử dụng alias từ khóa…

Răng cưa sẽ xảy ra trên lớp cha chứ không phải trên lớp đang gọi phương thức.

Ví dụ :

class Food
  def create_alias
    alias print_on_screen puts
  end
end

class Apple < Food
end

Apple.new.create_alias

Nhưng nếu bạn sử dụng alias_method phương thức sẽ chỉ được đặt bí danh trên Apple .

Bí danh tạo nên một bản sao của phương pháp

Theo mô tả của alias_method &alias (keyword) , Ruby tạo một bản sao của phương thức.

Đó không chỉ là một cái tên mới.

Nhưng bản sao thực tế của phương pháp .

Điều này có một số ý nghĩa thực tế:

def bacon
  123
end

alias :x :bacon

x
# 123

bacon
# 123

Vì vậy, chúng tôi có bí danh là x thành bacon , bây giờ hãy xem điều gì sẽ xảy ra nếu tôi xác định lại bacon :

def bacon
  234
end

x
# 123

bacon
# 234

x phương thức giữ nguyên, nhưng bacon trả về giá trị mới!

Điều này có thể gây ngạc nhiên nếu bạn bao gồm các mô-đun vào lớp của mình sau các phương thức răng cưa.

Hướng dẫn bằng Video

Tóm tắt

Nói chung, tôi thích alias_method hơn bởi vì đó là một phương pháp thực tế.

Trong khi alias từ khóa có một số thuộc tính đặc biệt mà bạn phải nhớ và ghi nhớ.

Bạn có học được điều gì mới không?

Chia sẻ bài viết này với những người bạn Ruby của bạn để họ cũng có thể học hỏi!