2 votes

Les méthodes doivent-elles toujours être à l'intérieur des classes en Ruby ?

Salut les gars, je suis nouveau sur Ruby. J'ai une question : Les méthodes doivent-elles toujours être à l'intérieur des classes ?

2voto

ndn Points 15391

Techniquement, elles sont toujours définies à l'intérieur d'une classe, mais cela ne signifie pas que vous devez toujours ouvrir une classe pour définir une méthode.

Voici ce qui pourrait ressembler à une fonction de premier niveau dans d'autres langues :

def foo
  puts self
  puts self.class
end

Si nous appelons simplement foo nous aurons :

main
Object

Cette méthode définit en fait une méthode d'instance privée dans l'objet Object classe. Nous voyons que self dans la portée de niveau supérieur est un objet spécial appelé main .


D'autre part, nous pouvons essayer d'appeler cette méthode sur d'autres choses :

'bar'.foo #!> private method `foo' called for "bar":String (NoMethodError)

Cette erreur s'est traduite par foo est privé. Nous pouvons utiliser une méthode spéciale appelée send pour invoquer des méthodes privées :

'bar'.send :foo

Il nous a eu :

bar
String

Nous pouvons également définir des méthodes dans les classes dites singleton. On peut les considérer comme des classes n'ayant qu'une seule instance. Par exemple :

foo = 'foo'

def foo.bar
  puts 'baz'
end

foo.bar    # => baz
'quix'.bar # !> undefined method `bar' for "quix":String
'foo'.bar  # !> undefined method `bar' for "foo":String

puts (foo.singleton_class.instance_methods - Object.instance_methods).first
  # => bar

Ici, le bar a été définie sur la classe singleton de foo . Notez que même une autre chaîne avec le même contenu est toujours une instance de différence, donc elle n'a pas l'attribut bar méthode.

2voto

Jörg W Mittag Points 153275

Bonjour, je suis nouveau dans le monde de Ruby. J'ai une question : Les méthodes doivent-elles toujours être à l'intérieur des classes ?

Non.

Les méthodes doivent toujours être à l'intérieur modules . (Les classes sont aussi des modules).

Exemple :

module Foo
  def bar; end
end

Il n'y a pas de classe ici.

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