Чтобы использовать себя. или нет .. в рельсах - PullRequest
73 голосов
/ 22 декабря 2008

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

def self.METHOD_NAME
end

или просто:

def METHOD_NAME
end

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

Ответы [ 6 ]

119 голосов
/ 22 декабря 2008
def self.method_name
end

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

def method_name
end

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

Это довольно хороший пост.

36 голосов
/ 22 декабря 2008

Краткое объяснение, что это значит:

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

a = "hello"

def a.informal
  "hi"
end

a.informal
=> "hi"

Что происходит, когда вы это делаете, это то, что объект a, который относится к классу String, получает свой класс, замененный на класс «ghost», он же метакласс, синглтон или собственный класс. Этот новый суперкласс класса - 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 ​​нет такой вещи, как методы класса, но семантика похожа.

11 голосов
/ 24 декабря 2008

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

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

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

6 голосов
/ 22 декабря 2008

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

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

def self.method_name конец

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

6 голосов
/ 22 декабря 2008

В этом контексте - 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)
1 голос
/ 22 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...