Para usar auto. ou não .. no Rails

Eu tenho codificado em Ruby há algum tempo, mas não entendo quando usar:

def self.METHOD_NAME end 

ou apenas:

 def METHOD_NAME end 

Em qualquer modelo Rails. É “auto” um modificador como privado em Java? Quando devo usá-lo e quando não? Obrigado uma tonelada.

 def self.method_name end 

define um método de class.

 def method_name end 

define um método de instância.

Este é um bom post sobre isso.

Uma rápida explicação do que isso significa:

Em ruby, você pode definir methods em um object específico:

 a = "hello" def a.informal "hi" end a.informal => "hi" 

O que acontece quando você faz isso é que o object a, que é da class String , recebe sua class alterada para uma class “fantasma”, também conhecida como metaclass, class singleton ou eigenclass. Essa nova class superclass é String .

Além disso, dentro das definições de class, self é definido para a class que está sendo definida,

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

O que acontece lá é que o object Greeting , que é da class Class , recebe uma nova metaclass com os novos methods, então quando você chama

 Greeting.informal => "hi" 

Não existem methods de class em ruby, mas as semânticas são semelhantes.

Um bom guia sobre quando usar qual:

  • Se o método depender de qualquer estado interno do object, ou precisar saber qual instância do object está sendo endereçada, NÃO o torne um método de class ( self. ).
  • Se o método não depende do estado do object, ou de ter uma instância específica do object, então pode ser feito um método de class.

Ao criar um método de class, pense cuidadosamente em qual class ou módulo ele pertence. Se você já se deparar com a duplicação de código em methods de class entre classs, inclua-o em um módulo que outras classs podem misturar.

Neste contexto – def self.method_name faz com que seja equivalente ao método estático Java:

ruby:

 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) 

auto é sempre o object atual

Quando você se vê aqui

def self.method_name end

Você não está em um método de instância, portanto, self é o object de class atual.

self é como a palavra chave this em Java. É uma referência à instância atual do object. Se o seu código de modelo executa uma operação no object atual, você provavelmente precisará de uma function sem o especificador self.method_name.