這些是類方法或「單例」方法。你應該熟悉的是attr_accessor。我們可以在測試類中實現類似的東西。
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">
在上面的例子中,我們創建的類的方法與「高清self.add_getter_and_setter」,但這不是唯一的方法。
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
使用擴展。 Module#extend是一個使用類方法擴展類的方法,同樣,Module#include方法也包含一個帶有實例方法的類。
class Klass
extend(Module.new do
def add_getter_and_setter(symbol)
..
end
end)
end
如果克拉斯已經被定義,我們可以重新打開它來添加類方法
class Klass
end
def Klass.add_getter_and_setter(symbol)
..
end
# or
class << Klass
def add_getter_and_setter(symbol)
..
end
end
那麼這些都是一些方法我知道如何,如果你看到這樣做,所以不同的語法只是實現其所有做同樣的事情。
注意:在rails中,我們都使用的通用類方法是'find'。它直接從Model類運行。
person = Person.find(1) # finds a person with id:1
一顆寶石也適用。 – 2009-08-28 05:03:46