В 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
? Кажется, что должно быть.
ruby
class-method
Питер
источник
источник
SalesforceSyncJob
то оно короче;)self.class
исключает необходимость поиска / замены, если вам случится переименовать класс.Использование
self.class.blah
НЕ то же самое, что использование,ClassName.blah
когда дело доходит до наследования.источник
self.class
является правильным для сохранения наследства. хотяmake1()
он определен вTruck
, он ссылаетсяBigTruck
на метод класса.Чтобы получить доступ к методу класса внутри метода экземпляра, выполните следующие действия:
Вот альтернативное решение вашей проблемы:
Теперь давайте используем наш класс:
источник
Если у вас есть доступ к методу делегата, вы можете сделать это:
В качестве альтернативы и, возможно, более чистым, если у вас есть более одного или двух методов, которые вы хотите делегировать классу и экземпляру:
Слово предостережения:
Не просто случайным образом
delegate
все, что не меняет состояние на класс и экземпляр, потому что вы начнете сталкиваться со странными проблемами столкновения имен. Делайте это экономно и только после того, как вы проверили, ничего больше не раздавлено.источник
источник
Вы делаете это правильно. Методы класса (аналогичные «статическим» методам в C ++ или Java) не являются частью экземпляра, поэтому на них следует ссылаться напрямую.
На этом замечании, в вашем примере вам лучше сделать default_make обычным методом:
Методы класса более полезны для функций вспомогательного типа, которые используют класс. Например:
источник
default_make
должен быть метод экземпляра. Даже если для этих примеров это проще, это не правильная семантика - по умолчанию это продукт класса, а не объекты, принадлежащие этому классу.Еще один:
источник
Вот подход, как вы могли бы реализовать
_class
метод, который работает какself.class
для этой ситуации. Примечание: не используйте это в рабочем коде, это ради интереса :)Из: Можете ли вы оценить код в контексте вызывающего в Ruby? а также http://rubychallenger.blogspot.com.au/2011/07/caller-binding.html
Возможно, правильный ответ - представить патч для Ruby :)
источник
Подобный ваш вопрос, вы можете использовать:
источник