Использовать себя. или нет.. в Rails

Я когда-то кодировал в Ruby, но я не понимаю, когда использовать:

def self.METHOD_NAME
end

или просто:

def METHOD_NAME
end

В любой модели Rails. Является ли "я" модификатором вроде private в Java? Когда я должен использовать его, а когда нет?. Спасибо тонну.

Ответ 1

def self.method_name
end

определяет метод класса.

def method_name
end

определяет метод экземпляра.

Это - неплохая публикация на нем.

Ответ 2

Быстрое объяснение того, что это означает:

В рубине вы можете определить методы для определенного объекта:

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 ​​нет такой вещи, как методы класса, но семантика аналогична.

Ответ 3

Хорошее руководство о том, когда использовать какой:

  • Если метод зависит от любого внутреннего состояния объекта или должен знать, какой экземпляр объекта он адресует, тогда НЕ делайте его методом класса (self.).
  • Если метод не зависит от состояния объекта или от наличия конкретного экземпляра объекта, то in может быть сделан методом класса.

При создании метода класса тщательно подумайте о том, к какому классу или модулю он принадлежит. Если вы когда-нибудь поймаете себя, дублируя код в методах класса по классам, включите его в модуль, который могут смешивать другие классы.

Ответ 4

self всегда текущий объект

Когда вы видите себя здесь

def self.method_name конец

Вы не находитесь в методе экземпляра, поэтому self - это текущий объект класса.

Ответ 5

В этом контексте - 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)

Ответ 6

self похож на ключевое слово this в Java. Это ссылка на текущий экземпляр объекта. Если ваш код модели выполняет операцию над текущим объектом, вам, вероятно, понадобится функция без спецификатора self.method_name.