Tôi đang chơi với các tính năng lập trình meta của ruby và tôi đang tìm kiếm một chút lông. Tôi đang cố gắng để bọc một cuộc gọi phương thức bằng cách sử dụng một mô-đun. Hiện nay, tôi đang làm điều này:Mở rộng một phương thức lớp học trong một mô-đun
module Bar
module ClassMethods
def wrap(method)
class_eval do
old_method = "wrapped_#{method}".to_sym
unless respond_to? old_method
alias_method old_method, method
define_method method do |*args|
send old_method, *args
end
end
end
end
end
def self.included(base)
base.extend ClassMethods
end
end
class Foo
include Bar
def bar(arg = 'foo')
puts arg
end
wrap :bar
end
Ba câu hỏi:
Có cách nào để làm điều này mà không cần đổi tên phương pháp, để cho phép việc sử dụng các
super
? Hoặc một cái gì đó sạch hơn/ngắn hơn?Có cách nào để đặt giá trị mặc định không?
Có phương tiện để di chuyển cuộc gọi thêm
wrap :bar
không?
Trong cuộc sống thực, tôi sẽ sử dụng kế thừa lớp cho điều đó. –
Tôi cũng thế, nhưng tôi đang cố gắng để hiểu được điều này. :-) –
Liên quan: http://stackoverflow.com/questions/6631182/difference-between-class-eval-and-instance-eval-in-a-module –