Module#refine
phương pháp có một lớp học và một khối và trả về một mô-đun tinh tế, vì vậy tôi nghĩ tôi có thể xác định:Cách tốt hơn để biến một lớp ruby thành một mô-đun hơn là sử dụng các sàng lọc?
class Class
def include_refined(klass)
_refinement = Module.new do
include refine(klass) {
yield if block_given?
}
end
self.send :include, _refinement
end
end
và kiểm tra sau đi
class Base
def foo
"foo"
end
end
class Receiver
include_refined(Base) {
def foo
"refined " + super
end
}
end
describe Receiver do
it { should respond_to(:foo) }
its(:foo) { should eq("refined foo") }
end
Vì vậy, sử dụng cải tiến, tôi có thể biến một lớp học thành một mô-đun, tinh chỉnh hành vi của nó một cách nhanh chóng và bao gồm nó trong các lớp khác.
- Có cách nào đơn giản hơn để biến lớp học thành mô-đun trong Ruby (ví dụ: trong ruby < 2)?
Trong C-thực hiện rb_mod_refine chúng ta thấy
refinement = rb_module_new(); RCLASS_SET_SUPER(refinement, klass);
Đây chỉ là thiết lập các lớp cha của sự tinh tế để
klass
rằng bản việc thực hiện các lớp bên trong module tinh tế?- Tôi biết rằng nhiều thừa kế IS được thực hiện thông qua Mô-đun, nhưng cộng đồng sẽ nghĩ gì về số
Class#include_refined
ở trên? Sẽ hợp lý để trích xuất khía cạnh này ra khỏi các sàng lọc? "Địa phương" vá bên trong một Lớp thay vì sử dụng các công tắc "sử dụng" để kích hoạt các sàng lọc?
Âm thanh như một giải pháp bất thường. Có bất kỳ trường hợp sử dụng thực tế nào trong Rails không? –
@BillyChan Hãy tưởng tượng tôi muốn sử dụng tất cả các hành động được định nghĩa trong một số lớp điều khiển được định nghĩa trong một số gem (hoặc Rails :: Engine) trong bộ điều khiển của tôi, tất nhiên kế thừa từ 'ApplicationController' của tôi. Lấy [Tolk :: LocalesController] (https://github.com/tolk/tolk/blob/master/app/controllers/tolk/locales_controller.rb) chẳng hạn. –
Tôi bối rối là tại sao bạn muốn làm điều này. Tại sao không định nghĩa nó như là một mô-đun, và nếu bạn cần phải khởi tạo một cái gì đó với _just những phương thức đó, bạn có thể tạo một lớp không làm gì ngoài việc bao gồm các mô-đun. – prater