Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

module_function in Ruby: wenn die Methoden eines Moduls sowohl als Modulmethoden als auch als Funktionen verfügbar sind

Beitrags-Cover: module_function in Ruby: wenn die Methoden eines Moduls sowohl als Modulmethoden als auch als Funktionen verfügbar sind
InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Im Ruby-Modul können Sie Code organisieren, aber manchmal muss eine Methode sowohl für Instanzen des Moduls als auch direkt aus dem Modul (wie eine Funktion) zugänglich sein. Dafür wird module_function verwendet.

Wie module_function funktioniert

  • macht die Methode privat für Instanzen des Moduls (lesen Sie hier über private).
  • fügt auch eine "Modulkopie" der Methode hinzu, die ohne Erstellung eines Objekts aufgerufen werden kann.
module MathHelper
  def square(x)
    x * x
  end

  module_function :square
end
Jetzt kann die Methode direkt über das Modul aufgerufen werden:
MathHelper.square(5) # => 25
Oder sie kann innerhalb anderer Methoden des Moduls verwendet werden (wie privat):
module MathHelper
  def cube(x)
    square(x) * x
  end

  module_function :cube
end

MathHelper.cube(3) # => 27

Besonderheiten

Privat für Instanzen des Moduls:
include MathHelper
square(5) # => NoMethodError (weil square privat geworden ist)
Eignet sich für Utilities
module_function wird häufig in "statischen Utilities" verwendet, um kein Modulobjekt zu erstellen, um Funktionen aufzurufen.
Zusammengefasst:
  • module_function macht die Methode gleichzeitig:
    • Privat für Instanzen (durch include)
    • Als Funktion verfügbar über das Modul
MathHelper.square(5)  # funktioniert
include MathHelper
square(5)             # Fehler
Dies ist praktisch für Module, die eine Sammlung von Utilities haben, wie in den Standardbibliotheken von Ruby (Math, Enumerable zum Beispiel).
Aber wenn Sie auf den Punkt achten - privat für Instanzen (durch include), könnten Sie fragen, was ist mit extend und prepend (über diese Methoden habe ich hier geschrieben)?
  • Die Modulmethode wird privat für Instanzen und über das Modul verfügbar.
  • Der Aufruf über include funktioniert nicht direkt (die Methode ist privat).
  • Der Aufruf über extend funktioniert als Klassenmethode.
  • Der Aufruf über prepend funktioniert nicht auf dem Objekt (die Methode ist privat).
Immer noch schwer zu verstehen? Lassen Sie uns das genauer betrachten:
module_function macht zwei Dinge gleichzeitig:
  1. Privat für Instanzen
    • Wenn Sie das Modul einfügen (include) oder prepend, wird die Methode privat für alle Objekte, das heißt, Sie können sie nicht einfach so aufrufen: obj.method - es wird ein Fehler sein.
    • Ruby macht das, damit Sie diese Methode nicht versehentlich auf einer Instanz aufrufen können.
  2. Über das Modul verfügbar
    • Ruby erstellt eine Kopie der Methode auf Modulebene.
    • Deshalb kann man aufrufen: ModuleName.method - das funktioniert wie eine "statische Funktion".
Ein einfaches Beispiel:
module Utils
  def greet
    "Hallo"
  end
  module_function :greet
end

# Über das Modul kann man
Utils.greet  # => "Hallo"

# Über include — kann man nicht, weil privat
include Utils
greet        # => Fehler NoMethodError
  • Warum funktioniert extend?
    extend fügt die Methoden des Moduls in die Singleton-Klasse der Klasse oder des Objekts ein. Dort wird die Methode über die Klasse/das Objekt aufgerufen, nicht über die Instanz, das heißt, es funktioniert.
  • Warum funktioniert prepend nicht?
    prepend fügt die Methode in die Vererbungskette ein, aber die ursprüngliche Methode bleibt privat -> das Objekt kann sie nicht direkt aufrufen.

Dieser Beitrag hat noch keine Ergänzungen vom Autor.

28. Okt, 14:42 Uhr

Wie funktioniert &:to_s in Ruby und was ist Symbol#to_proc

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was sind Proc und Lambda in Ruby?
28. Okt, 15:57 Uhr

Was sind Proc und Lambda in Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?
29. Okt, 17:54 Uhr

Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt
29. Okt, 18:29 Uhr

Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
==, gleich?, eql?, === in Ruby: was sie überprüfen und wann man sie verwenden sollte
29. Okt, 20:47 Uhr

==, gleich?, eql?, === in Ruby: was sie überprüfen und wann man sie verwenden sollte

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Include, Extend, Prepend in Ruby: wie sie funktionieren und wo der Unterschied liegt
29. Okt, 21:20 Uhr

Include, Extend, Prepend in Ruby: wie sie funktionieren und wo der Unterschied liegt

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was ist Memoization in Ruby?
30. Okt, 10:17 Uhr

Was ist Memoization in Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
is_a?, kind_of?, instance_of? — wie prüft Ruby den Typ eines Objekts?
30. Okt, 19:55 Uhr

is_a?, kind_of?, instance_of? — wie prüft Ruby den Typ eines Objekts?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
&& vs and — der Unterschied in Ruby, der Ihren Code brechen kann
30. Okt, 20:23 Uhr

&& vs and — der Unterschied in Ruby, der Ihren Code brechen kann

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Variablen in Ruby: @, @@ und Klasseninstanzvariablen
30. Okt, 20:54 Uhr

Variablen in Ruby: @, @@ und Klasseninstanzvariablen

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Der Unterschied zwischen blank?, present?, empty? und nil? in Ruby
30. Okt, 21:06 Uhr

Der Unterschied zwischen blank?, present?, empty? und nil? in Ruby

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was ist Middleware in Ruby on Rails und wann wird sie verwendet?
04. Nov, 10:39 Uhr

Was ist Middleware in Ruby on Rails und wann wird sie verwendet?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska