Використовувати себе. чи ні .. в Rails


76

Я кодую в Ruby вже деякий час, але я не розумію, коли використовувати:

def self.METHOD_NAME
end

або просто:

def METHOD_NAME
end

У будь-якій моделі Rails. Чи є "self" модифікатором, як private в Java? Коли я повинен використовувати його, а коли ні ?. Дякую тонна.


5
"self" у цьому контексті відповідає "static" у Java. У цьому випадку self посилається на КЛАС (на відміну від Об’єкта). Класи Ruby також можуть мати приватні та захищені декларації. Рубі також використовує self як посилання "це" в ОБ'ЄКТІ.
Тобі Хеде,

Відповіді:


126
def self.method_name
end

визначає метод класу.

def method_name
end

визначає метод екземпляра.

Це досить хороший пост на ньому.


37

Швидке пояснення того, що це означає:

У ruby ​​ви можете визначити методи для певного об'єкта:

a = "hello"

def a.informal
  "hi"
end

a.informal
=> "hi"

Коли ви це робите, це те, що об’єкт a, який є класом String, змінює свій клас на клас «привид», він же метаклас, клас singleton або власний клас. Це новий клас суперкласу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

Хороший посібник щодо того, коли використовувати який:

  • Якщо метод залежить від будь-якого внутрішнього стану об'єкта або повинен знати, до якого екземпляра об'єкта він звертається, НЕ робіть його класом (self. методом ).
  • Якщо метод не залежить від стану об'єкта або від наявності конкретного екземпляра об'єкта, тоді в може бути зроблений метод класу.

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


6

У цьому контексті - 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

Я завжди є поточним об'єктом

Коли ти бачиш тут себе

def self.method_name end

Ви не в методі екземпляра, тому self є поточним об'єктом Class .


2

self схоже на це ключове слово в Java. Це посилання на поточний екземпляр об’єкта. Якщо ваш код моделі виконує операцію з поточним об'єктом, то, ймовірно, вам знадобиться функція без специфікатора self.method_name.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.