2016-11-25 1 views
-2

Erhöhung Wenn Sie eine Reihe von Klassen in Ruby Namespace wollen, tun Sie in der Regel:Namespace den Inhalt einer Datei, aber ohne Einzug

# my_namespace.rb 

module MyNamespace 

    class ClassOne 
    # ... 
    end 

    class ClassTwo 
    # ... 
    end 

    # ... 
end 

, die die unglückliche Nebenwirkung der Erhöhung der Einzugsebene aller hat der Code in der Datei. Ich wäre eher in der Lage, etwas wie eine Anweisung an der Spitze der Datei zu tun, die effektiv gesagt, "alles in dieser Datei sollte in der MyNamespace Modul sein".

Ist das möglich?

HINWEIS: Ich bin bewusst, dass ich nur die module Verpackung halten konnte aber nicht indent alles, aber diese Lösung ist imo nicht akzeptabel.

+3

Sie könnten tun 'Klasse MyNamespace :: ClassOne' –

+0

Guter Punkt. Nicht ideal, aber die zusätzliche Ausführlichkeit jedes Klassennamens ist wohl ein kleineres Übel als die zusätzliche Einzugsebene. Ich werde diese Antwort akzeptieren, wenn niemand mit etwas Besserem zu tun hat. – Jonah

+0

Was ist das Problem, das Sie versuchen zu lösen? Warum ist das Hinzufügen einer Einrückungsebene ein Problem? Ich würde argumentieren, dass die Ebene der Einrückung hilft, den Code zu verstehen und zu lesen. – spickermann

Antwort

-1

Die Einrückungsebene des Codes ist eine Funktion eines Editors/IDE. Die einfache Antwort lautet: Den Code nicht einrücken.

Es ist nur ein visueller Aspekt, die Höhe des Umfangs wird erhöht, unabhängig vom visuellen Effekt.

Dies kann vermieden werden durch die Nutzung der anderen Syntax, wie die Verwendung des Scope-Operators als Sergio Tulentsev erwähnt.

Sie könnten Eval verwenden und in einer Datei lesen, aber ich denke, dass wäre schrecklich, obwohl es das Einrückung "Problem" beheben würde.

module General 
    module_eval "class One end" 
    module_eval "class Two; p 'Done creating Two'; def self.report(); 'I am in General::Two' ; end; end" 

    module_eval File.read('three.rb') 
end 

p General::Two.report 
p General::Three.new.report 

als separate Datei, three.rb

class Three 
    def report 
    "This is #{self.class} and has #{self.class.ancestors}" 
    end 
end 

Aber anscheinend nichts wirklich sinnvoll für die Vertiefungen weg zu halten.

Ich finde es als ein hilfreiches Werkzeug visuell zu verfolgen Umfang beim Lesen, basierend auf Einrückung, so dass 2, 4, 6 Leerzeichen oder 8 Leerzeichen als Eindruck wirklich nicht viel Schmerz scheint. Auf jeder Ebene wären 8 Leerzeichen (Reiter-Darstellung) irritierender, da die Dinge auf der rechten Seite des Bildschirms ablaufen.

+0

Dank @Sergio Tulentsev Ich versuche normalerweise, Namen zu kopieren/einfügen, ich halte sie für so wichtig. Das hat zwei niederen Stimmen verdient. – vgoff

+0

Das ist nicht mein Downvote, btw :) –

+0

Ich dachte nicht, dass es war, nur dass ich Ihren Namen abgeschlachtet habe und zu Recht ausgepeitscht werden sollte. :) – vgoff

-3

Rubocop wird Ihnen sagen, was zu tun ist nach der Ruby style guide!

Edit:

# my_namespace.rb 

module MyNamespace 

class ClassOne 
    # ... 
end 

class ClassTwo 
    # ... 
end 

# ... 
end 

Ursachen dieser Rubocop Warnung:

Warning:13:1: C: Incorrect indentation detected (column 0 instead of 2).

+0

Bitte nehmen Sie sich die Zeit, den Originalbeitrag zu lesen. Ich behandle dieses Problem speziell im letzten Absatz und behaupte, dass das einfache Einrücken keine akzeptable Lösung ist. Also, rubucop stimmt mit mir überein, und diese "Lösung" war eine, die ich bereits gesagt habe, sollte nicht berücksichtigt werden .... – Jonah

+0

Dies ist die Beschreibung der "Sie in der Regel tun:" Teil des ursprünglichen Beitrags, und dies auch zu stärken. – vgoff

+0

Es gibt keine solche Anweisung in Ruby AFAIK. In C++ wird unter Verwendung von Namespace std; durch z. Googles C++ - Stilführer, der einen Block ohne Einrückung bevorzugt. Vielleicht wird der bevorstehende officiel C++ style Guide keinen Block bevorzugen. – maasha

Verwandte Themen