75 votes

Pour utiliser soi-même. ou pas .. dans Rails

Je code en Ruby depuis quelque temps déjà, mais je ne comprends pas quand utiliser:

 def self.METHOD_NAME
end
 

ou juste:

 def METHOD_NAME
end
 

Dans n'importe quel modèle Rails. "Self" est-il un modificateur comme privé en Java? Quand devrais-je l'utiliser et quand pas ?. Merci beaucoup.

123voto

DanSingerman Points 17301
 def self.method_name
end
 

définit une méthode de classe

 def method_name
end
 

définit une méthode d'instance

This: http://www.rubyfleebie.com/understanding-class-methods-in-ruby/ est un très bon post à ce sujet.

36voto

krusty.ar Points 3141

Une explication rapide de ce que cela signifie:

En ruby, vous pouvez définir des méthodes sur un objet particulier:

a = "hello"

def a.informal
  "hi"
end

a.informal
=> "hi"

Ce qui se passe quand vous faites cela, c'est que l'objet a, qui est de classe String, obtient sa classe changé pour un "fantôme" de la classe, aka métaclasse, classe singleton ou eigenclass. Cette nouvelle classe de super-classe est - String.

Aussi, à l'intérieur des définitions de classe, self est fixé à la classe définie, de sorte

class Greeting
  def self.say_hello
    "Hello"
  end
  #is the same as:
  def Greeting.informal
    "hi"
  end
end

Ce qui s'y passe est que l'objet d' Greeting, ce qui est de la classe Class, obtient une nouvelle métaclasse avec les nouvelles méthodes, de sorte que lorsque vous appelez

Greeting.informal
=> "hi"

Il n'y a pas une telle chose comme les méthodes de la classe en ruby, mais la sémantique sont similaires.

11voto

bradheintz Points 2484

Un bon guide sur l'utilisation qui:

  • Si la méthode dépend de l'état interne de l'objet, ou doit savoir de quelle instance de l'objet auquel il s'adresse, alors il NE faut PAS en faire une classe (self.) de la méthode.
  • Si la méthode ne dépend pas de l'état de l'objet, ou sur le fait d'une instance spécifique de l'objet, puis dans une méthode de classe.

Lors de la prise d'une méthode de classe, réfléchir soigneusement à la classe ou du module il appartient. Si jamais vous vous surprenez à la duplication de code dans les méthodes de la classe de toutes les classes, facteur dans un module que d'autres classes peuvent se mêler dans.

6voto

Lolindrath Points 1779

Dans ce contexte, def self.method_name le rend en quelque sorte équivalent à la méthode statique Java:

rubis:

 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)
 

6voto

theschmitzer Points 3058

self est toujours l'objet actuel

Quand on se voit ici

def self.method_name end

Vous n'êtes pas dans une méthode d'instance, donc self est l'objet Class actuel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X