В Ruby, как Вы называете метод класса от одного из который экземпляры класса? Скажите, что я имею
class Truck
def self.default_make
# Class method.
"mac"
end
def initialize
# Instance method.
Truck.default_make # gets the default via the class's method.
# But: I wish to avoid mentioning Truck. Seems I'm repeating myself.
end
end
строка Truck.default_make
получает значение по умолчанию. Но есть ли способ сказать это без упоминания Truck
? Кажется, что должно быть.
Вместо того, чтобы ссылаться на буквальное имя класса, внутри метода экземпляра вы можете просто вызвать self.class.whatever
.
class Foo
def self.some_class_method
puts self
end
def some_instance_method
self.class.some_class_method
end
end
print "Class method: "
Foo.some_class_method
print "Instance method: "
Foo.new.some_instance_method
Выходы:
Class method: Foo Instance method: Foo
Вы делаете это правильно. Методы класса (аналогичные «статическим» методам в C ++ или Java) не являются частью экземпляра, поэтому на них нужно ссылаться напрямую.
В связи с этим, в вашем примере лучше сделать 'default_make' обычным методом:
#!/usr/bin/ruby
class Truck
def default_make
# Class method.
"mac"
end
def initialize
# Instance method.
puts default_make # gets the default via the class's method.
end
end
myTruck = Truck.new()
Методы класса более полезны для функций служебного типа, которые используют этот класс. Например:
#!/usr/bin/ruby
class Truck
attr_accessor :make
def default_make
# Class method.
"mac"
end
def self.buildTrucks(make, count)
truckArray = []
(1..count).each do
truckArray << Truck.new(make)
end
return truckArray
end
def initialize(make = nil)
if( make == nil )
@make = default_make()
else
@make = make
end
end
end
myTrucks = Truck.buildTrucks("Yotota", 4)
myTrucks.each do |truck|
puts truck.make
end
Чтобы получить доступ к методу класса внутри метода экземпляра, выполните следующие действия:
self.class.default_make
Вот альтернативное решение вашей проблемы:
class Truck
attr_accessor :make, :year
def self.default_make
"Toyota"
end
def make
@make || self.class.default_make
end
def initialize(make=nil, year=nil)
self.year, self.make = year, make
end
end
Теперь давайте воспользуемся нашим классом:
t = Truck.new("Honda", 2000)
t.make
# => "Honda"
t.year
# => "2000"
t = Truck.new
t.make
# => "Toyota"
t.year
# => nil