Đây là các phương pháp lớp hoặc phương pháp 'singleton'. Một trong những bạn nên quen thuộc với attr_accessor. Chúng tôi có thể thực hiện một cái gì đó giống như nó trong một lớp học thử nghiệm.
class Klass
def self.add_getter_and_setter(symbol)
module_eval "def #{symbol}; @#{symbol}; end"
module_eval "def #{symbol}=(val); @#{symbol} = val; end"
end
end
class Person < Klass
add_getter_and_setter :name
add_getter_and_setter :phone
end
person = Person.new
person.name = 'John Smith'
person.phone = '555-2344'
person # returns <Person:0x28744 @name="John Smith", @phone="555-2344">
Trong ví dụ trên, chúng tôi đã tạo phương thức lớp bằng 'def self.add_getter_and_setter' nhưng đây không phải là cách duy nhất.
class Klass
class << self # opens the singleton class
def add_getter_and_setter(symbol) # note we dont specify self as it is already within the context of the singleton class
..
end
end
end
Sử dụng mở rộng. Mở rộng mô-đun # là một phương thức mở rộng một lớp với các phương thức lớp tương tự như vậy phương thức Module # include bao gồm một lớp với các phương thức ví dụ.
class Klass
extend(Module.new do
def add_getter_and_setter(symbol)
..
end
end)
end
Nếu Klass đã được xác định chúng ta có thể mở lại nó để thêm các phương pháp lớp
class Klass
end
def Klass.add_getter_and_setter(symbol)
..
end
# or
class << Klass
def add_getter_and_setter(symbol)
..
end
end
Vâng những là một vài cách để tôi biết làm thế nào để làm điều này vì vậy nếu bạn thấy cú pháp khác nhau chỉ nhận ra tất cả của nó làm điều tương tự.
Lưu ý: trong đường ray, một phương pháp phổ biến mà tất cả chúng ta sử dụng là 'tìm'. Nó được chạy trực tiếp ra khỏi lớp Model.
person = Person.find(1) # finds a person with id:1
Nguồn
2009-08-28 13:41:32
Đá quý cũng hoạt động. –