Warum ist es wichtig, über Metaprogrammierung und Eigenklassen in Ruby zu lernen?

8

Ich experimentiere gerade mit Ruby und Rails und habe ein paar Abschnitte in Tutorials und Büchern über Metaprogrammierung gemacht. Viele erwähnen, dass es ein wesentlicher Bestandteil von Ruby ist, aber sie gehen nicht wirklich ins Detail. Es ist, als wäre Metaprogrammierung die letzte Grenze für Ruby-Programmierer. Da ich von einem .NET-Hintergrund komme, habe ich Schwierigkeiten zu verstehen, warum es so nützlich ist.

  • Welche Vorteile bietet die Metaprogrammierung?
  • Was ist eine Eigenklasse und wie unterscheidet sie sich von einem Singleton?
  • In welchen Situationen ist Metaprogrammierung üblich?
  • Welche ethischen Implikationen bestehen darin, Code zu verwenden, um das Verhalten von anderem Code zu ändern, insbesondere Code, der nicht Ihr eigener Code ist?
link664 23.08.2011, 07:17
quelle

2 Antworten

16
  • Welche Vorteile bringt die Metaprogrammierung?

    Sie können aussagekräftigere APIs erstellen als ohne sie (z. B. verwendet ActiveRecord Metaprogrammierung, um Zugriffsmethoden basierend auf den Spaltennamen einer Tabelle zu definieren. So können Sie Dinge wie person.age anstelle von% person.read_attribute("age") schreiben, wo person ist ein aktives Record-Objekt und die people -Tabelle hat eine Spalte namens age ) und Sie können einige Dinge mit wesentlich weniger Code durchführen, als Sie es sonst tun würden.

  • Was ist eine Eigenklasse und wie unterscheidet sie sich von einem Singleton?

    Die Begriffe "Eigenklasse" und "Singleton-Klasse" werden im Zusammenhang mit Ruby synonym verwendet.

  • In welchen Situationen wird Metaprogrammierung häufig verwendet?

    In Situationen, in denen Sie sonst viel Code für die Kesselplatte oder beim Erstellen von DSLs hätten.

    Beispiel für den Anwendungsfall 1:

    Anstatt etwas Code-Code wie folgt zu schreiben:

    %Vor%

    Sie können diesen viel kürzeren Code mit der Metaprogrammierungsmethode attr_accessor schreiben, die Getter- und Setter-Methoden automatisch mit Namen basierend auf den Argumenten definiert, die Sie ihr geben:

    %Vor%

    Wenn attr_accessor noch nicht in der Standardbibliothek vorhanden ist, könnten Sie es selbst so definieren (um Ihnen eine Idee zu geben, wie Metaprogrammierung in Ruby aussieht):

    %Vor%

    Ende

  • Welche ethischen Implikationen gibt es, wenn Sie Code verwenden, um das Verhalten von anderem Code zu ändern, insbesondere Code, der nicht Ihr eigener Code ist?

    Keine.

sepp2k 23.08.2011, 07:38
quelle
5

Es gibt eine Zeit und einen Ort für die Metaprogrammierung. Ich denke, es wird in Ruby-Büchern stark erwähnt, weil Leute gerne zeigen, was Ruby tun kann, das andere Sprachen nicht so gut können.

Metaprogrammieren ist, als ob man das japanische Wort für "Burger" oder "Nudelsuppe" nicht kennt, aber die Japaner für "diesen einen bitte" ("kore o kudasai") kennst und auf den Punkt auf der Speisekarte zeigen kann . Es erlaubt mehr Flexibilität, aber Sie brauchen mehr Kontext, um genau zu wissen, was getan wird.

Wenn Sie ActiveRecord erstellen, mit dem Sie find_by_foo ausführen können, ist Metaprogrammierung sinnvoll.

Wenn Sie eine Bibliothek zum Testen von Mutationen schreiben, z. B. Zombie-Chaser oder eine Charakterisierungstestanwendung, die verschiedene Implementierungen von Ruby testet, z. B. den Small Eigen Collider , dann macht Metaprogrammierung Sinn.

Wenn Sie jedoch eine Anwendung schreiben, sollten Sie generell keine Metaprogrammierung durchführen, sondern lediglich programmieren. Wenn Sie beispielsweise instance_variable_set in Ihrer Anwendung verwenden, ist das eher ein Code-Geruch als ein Hinweis darauf, wie kompetent Sie sind.

Verwandte Fragen, die Sie lesen möchten, sind Ссылка und < a href="https://stackoverflow.com/questions/788689/ruby-metaprogramming-online-tutorial"> Ruby metaprogramming Online-Tutorial und metaprogramming wie viel ist zu viel? .

Ich empfehle wirklich das Buch "Metaprogramming Ruby", weil es nicht nur Metaprogrammierung lehrt, sondern auch, wie Ruby funktioniert.

    
Andrew Grimm 23.08.2011 23:35
quelle