39 votes

Quelle est la différence entre ces conventions d'espace de noms Ruby ?

Alors Module peut être utilisé en Ruby pour fournir un espacement des noms en plus des mixins, comme suit :

module SomeNamespace
  class Animal

  end
end

animal = SomeNamespace::Animal.new

Mais j'ai également vu l'utilisation suivante :

module SomeNamespace
end

class SomeNamespace::Animal

end

animal = SomeNamespace::Animal.new

Ma question est de savoir en quoi ils sont différents (s'ils le sont) et lequel est le plus idiomatique de Ruby ?

44voto

DarkEnergy Points 1

La différence réside dans l'imbrication.

Dans l'exemple ci-dessous, vous pouvez voir que la première méthode utilisant la classe Foo, peut obtenir les variables constantes BAR_A de la portée externe sans erreur.

Pendant ce temps, la classe Baz va exploser avec une erreur de constante non initialisée A::B::Baz::BAR_A. Comme elle n'introduit pas A::* implicitement, seulement A::B::*explicitement.

module A
  BAR_A = 'Bar A!'
  module B
    BAR_B = 'Bar B!'
      class Foo
        p BAR_A
        p BAR_B
      end
  end
end

class A::B::Baz
  p BAR_A
  p BAR_B
end

Les deux comportements ont leur place. À mon avis, il n'y a pas de véritable consensus au sein de la communauté quant à savoir quelle est la seule vraie méthode Ruby (tm). Personnellement, j'utilise la première, la plupart du temps.

6voto

Benoit Garret Points 8292

La seule différence entre les deux approches est que la seconde lancera uninitialized constant Object::SomeNamespace si l'espace de nom n'a pas été déclaré précédemment.

Lorsqu'il est déclaré dans un seul fichier, j'opterais pour le premier parce que vous n'avez pas à répéter SomeNamespace .

Lorsque j'utilise plusieurs fichiers, j'utilise également le second, pour éviter de rencontrer le problème suivant :

# in a.rb
require 'b'

module SomeNamespace
  def self.animal
    Animal.new
  end
end

# in b.rb
class SomeNamespace::Animal

end

# irb
require 'a' # explodes with the uninitialized constant error

Cet exemple est peut-être artificiel, mais il est facile de le déclencher si votre base de code est un peu plus grande. J'utilise généralement la méthode explicite (votre première méthode) pour éviter cela.

Une chose qui peut être utile lors de l'utilisation de la deuxième forme est qu'elle détectera les fautes de frappe dans l'espace de noms.

Il ne semble pas y avoir de méthode établie pour créer des espaces de noms, Devise par exemple mélange les deux approches : premier , le deuxième .

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