1 - nó vẫn được sử dụng?
Dường như có, alias_method_chain()
là still used in Rails (kể từ phiên bản 3.0.0).
2 - khi nào bạn sử dụng alias_method_chain và tại sao?
(Lưu ý:. sau chủ yếu dựa vào các cuộc thảo luận của alias_method_chain()
trong Metaprogramming Ruby bởi Paolo Perrotta, mà là một cuốn sách tuyệt vời mà bạn nên có được bàn tay của bạn trên)
Hãy bắt đầu với ví dụ cơ bản:
class Klass
def salute
puts "Aloha!"
end
end
Klass.new.salute # => Aloha!
Giả sử chúng tôi muốn bao quanh Klass#salute()
với hành vi ghi nhật ký. Chúng ta có thể làm những gì Perrotta gọi một xung quanh bí danh:
class Klass
def salute_with_log
puts "Calling method..."
salute_without_log
puts "...Method called"
end
alias_method :salute_without_log, :salute
alias_method :salute, :salute_with_log
end
Klass.new.salute
# Prints the following:
# Calling method...
# Aloha!
# ...Method called
Chúng tôi định nghĩa một phương pháp mới được gọi là salute_with_log()
và aliased nó để salute()
. Mã được sử dụng để gọi salute()
vẫn hoạt động nhưng cũng có hành vi ghi nhật ký mới.Chúng tôi cũng xác định một bí danh với bản gốc salute()
, vì vậy chúng tôi vẫn có thể chào mà không cần đăng nhập:
Klass.new.salute_without_log # => Aloha!
Vì vậy, salute()
bây giờ được gọi salute_without_log()
. Nếu chúng tôi muốn đăng nhập, chúng tôi có thể gọi salute_with_log()
hoặc salute()
, là bí danh của cùng một phương pháp. Bối rối? Tốt!
Theo Perrotta, loại xung quanh bí danh là rất phổ biến trong Rails:
Nhìn vào một ví dụ khác của Rails giải quyết vấn đề theo cách riêng của nó. Một vài các phiên bản trước, các mã Rails chứa nhiều trường hợp các thành ngữ giống nhau: một Khoảng Bí danh (155) được sử dụng để thêm một tính năng đến một phương pháp, và phiên bản cũ của phương pháp này được đổi tên thành một cái gì đó như method_without_feature()
. Ngoài các tên phương thức , thay đổi mỗi lần , mã đã thực hiện điều này là luôn giống nhau, được nhân đôi trên địa điểm. Trong hầu hết các ngôn ngữ, bạn không thể tránh loại trùng lặp đó. Trong Ruby, bạn có thể rắc một số phép thuật lập trình metaprogram trên mẫu của bạn và giải nén nó vào phương thức riêng của nó ... và do đó được sinh ra alias_method_chain()
.
Nói cách khác, bạn cung cấp các phương pháp ban đầu, foo()
, và các phương pháp nâng cao, foo_with_feature()
, và bạn kết thúc với ba phương pháp: foo()
, foo_with_feature()
, và foo_without_feature()
. Hai cái đầu tiên bao gồm tính năng, trong khi thứ ba thì không. Thay vì sao chép các bí danh này xung quanh, alias_method_chain()
provided by ActiveSupport thực hiện tất cả bí danh cho bạn.
+1 để nói "Bối rối? Tốt!" – jperelli
và bổ sung nhỏ: vì vậy bây giờ chúng ta có thể chỉ cần gõ '' 'alias_method_chain: foo,: feature''' và chúng ta sẽ có 3 phương thức:' '' foo''', '' 'foo_with_feature''',' '' foo_without_feature '' 'được đặt tên đúng như * Yases Sulaiman * mô tả trước – freemanoid
" Bất kỳ công nghệ tiên tiến nào cũng không thể phân biệt được với phép thuật. " Arthur C. Clarke –