Ответ 1
def self.method_name
end
определяет метод класса.
def method_name
end
определяет метод экземпляра.
Это - неплохая публикация на нем.
Я когда-то кодировал в Ruby, но я не понимаю, когда использовать:
def self.METHOD_NAME
end
или просто:
def METHOD_NAME
end
В любой модели Rails. Является ли "я" модификатором вроде private в Java? Когда я должен использовать его, а когда нет?. Спасибо тонну.
def self.method_name
end
определяет метод класса.
def method_name
end
определяет метод экземпляра.
Это - неплохая публикация на нем.
Быстрое объяснение того, что это означает:
В рубине вы можете определить методы для определенного объекта:
a = "hello"
def a.informal
"hi"
end
a.informal
=> "hi"
Что происходит, когда вы это делаете, так это то, что объект a, который имеет класс String
, получает свой класс, измененный на класс "призрак", например метакласс, одноэлементный класс или eigenclass. Этот суперкласс класса String
.
Кроме того, определения внутри класса, self
устанавливается в определяемый класс, поэтому
class Greeting
def self.say_hello
"Hello"
end
#is the same as:
def Greeting.informal
"hi"
end
end
Что происходит, что объект Greeting
, который имеет класс Class
, получает новый метакласс с новыми методами, поэтому, когда вы вызываете
Greeting.informal
=> "hi"
В ruby нет такой вещи, как методы класса, но семантика аналогична.
Хорошее руководство о том, когда использовать какой:
self.
).При создании метода класса тщательно подумайте о том, к какому классу или модулю он принадлежит. Если вы когда-нибудь поймаете себя, дублируя код в методах класса по классам, включите его в модуль, который могут смешивать другие классы.
self всегда текущий объект
Когда вы видите себя здесь
def self.method_name конец
Вы не находитесь в методе экземпляра, поэтому self - это текущий объект класса.
В этом контексте - def self.method_name делает его эквивалентным статическому методу Java:
рубин:
class HexHelper
def self.to_h(num)
sprintf("%x", num)
end
end
use: HexHelper.to_h(12345)
Java:
public class HexHelper
{
public static String toHex(int num)
{
return new PrintfFormat("%x").sprintf(num);
}
}
use: HexHelper.toHex(12345)
self похож на ключевое слово this в Java. Это ссылка на текущий экземпляр объекта. Если ваш код модели выполняет операцию над текущим объектом, вам, вероятно, понадобится функция без спецификатора self.method_name.