86 votes

Ruby : Comment créer une méthode statique publique ?

En Java, je pourrais le faire :

public static void doSomething();

Je peux alors accéder à la méthode de manière statique sans créer d'instance :

className.doSomething(); 

Comment puis-je faire cela en Ruby ? C'est ma classe et d'après ce que j'ai compris self. rend la méthode statique :

class Ask

  def self.make_permalink(phrase)
    phrase.strip.downcase.gsub! /\ +/, '-'
  end

end

Mais quand j'essaie d'appeler :

Ask.make_permalink("make a slug out of this line")

J'ai compris :

undefined method `make_permalink' for Ask:Class

Pourquoi si je n'ai pas déclaré la méthode comme étant privée ?

125voto

devanand Points 3162

L'exemple que vous avez donné fonctionne très bien

class Ask
  def self.make_permalink(phrase)
    phrase.strip.downcase.gsub! /\ +/, '-'
  end
end

Ask.make_permalink("make a slug out of this line")

J'ai essayé en 1.8.7 et aussi en 1.9.3. Y a-t-il une faute de frappe dans votre script original ?

Tous les meilleurs

29voto

Ivailo Bardarov Points 1484

Il existe une autre syntaxe qui présente l'avantage de permettre l'ajout de méthodes statiques supplémentaires.

class TestClass

  # all methods in this block are static
  class << self
    def first_method
      # body omitted
    end

    def second_method_etc
      # body omitted
    end
  end

  # more typing because of the self. but much clear that the method is static
  def self.first_method
    # body omitted
  end

  def self.second_method_etc
    # body omitted
  end
end

7voto

jefflunt Points 20244

Voici mon copier/coller de votre code dans IRB. Il semble fonctionner correctement.

$ irb
1.8.7 :001 > class Ask
1.8.7 :002?>   
1.8.7 :003 >   def self.make_permalink(phrase)
1.8.7 :004?>     phrase.strip.downcase.gsub! /\ +/, '-'
1.8.7 :005?>   end
1.8.7 :006?>   
1.8.7 :007 > end
 => nil 
1.8.7 :008 > Ask.make_permalink("make a slug out of this line")
 => "make-a-slug-out-of-this-line"

Il semble que cela fonctionne. Testez-le dans votre irb également, et voyez les résultats que vous obtenez. J'utilise la version 1.8.7 dans cet exemple, mais je l'ai également essayé dans une session Ruby 1.9.3 et cela a fonctionné de manière identique.

Utilisez-vous MRI comme implémentation de Ruby (même si je ne pense pas que cela fasse une différence dans ce cas) ?

Sur irb passer un appel à Ask.public_methods et vérifiez que le nom de votre méthode figure dans la liste. Par exemple :

1.8.7 :008 > Ask.public_methods
 => [:make_permalink, :allocate, :new, :superclass, :freeze, :===, 
     ...etc, etc.] 

Puisque vous avez également marqué ceci comme un ruby-on-rails Si vous voulez vérifier le modèle réel de votre application, vous pouvez bien sûr utiliser la console de rails : ( bundle exec rails c ) et vérifier le caractère public de la méthode en question.

0voto

Keen Learner Points 1054

J'utilise ruby 1.9.3 et le programme fonctionne sans problème dans mon irb également.

1.9.3-p286 :001 > class Ask
1.9.3-p286 :002?>     def self.make_permalink(phrase)
1.9.3-p286 :003?>         phrase.strip.downcase.gsub! /\ +/, '-'
1.9.3-p286 :004?>       end
1.9.3-p286 :005?>   end
 => nil 
1.9.3-p286 :006 > Ask.make_permalink("make a slug out of this line")
 => "make-a-slug-out-of-this-line"

Cela fonctionne également dans mon script de test. Rien d'anormal dans le code que vous avez donné, tout va bien.

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