Salut les gars, je suis nouveau sur Ruby. J'ai une question : Les méthodes doivent-elles toujours être à l'intérieur des classes ?
Réponses
Trop de publicités?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.
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.