[ruby] Wie kann man Ruby-Text aus einer Datei einkopieren

OP #4497077
Ich habe > 2000 Zeilen Struct-Definitionen, die in ~20 Array eingefügt 
werden. Das Ganze ist in einer eigenen Quell-Datei options.rb.

Die Array-Variablen werden in einer Methode gebraucht.

Ich will diese Methode aber übersichtlich halten und deswegen die > 2000 
Zeilen nicht einfach dort hinein kopieren, sondern den Text aus 
options.rb wie in c includen.

Nur: wie bekommt man das hin?
Gast
Ich benutze für solche config-Sachen JSON files. Die sind lesbar, und 
ruby kann das schön parsen.

im controller zum beispiel:
require 'json'
@data_hash = JSON.parse(File.read('parameter_config.json'))

und in der view dann einfach mit :parameter (oder wie auch immer der key 
heisst)

Vielleicht ist das eine Alternative?
OP
devynF schrieb:
> Ich benutze für solche config-Sachen JSON files. Die sind lesbar, und
> ruby kann das schön parsen.

Das wäre eine Möglichkeit, die Sache anders zu lösen, aber die Daten, 
die da importiert werden sollen, sind sperrig und häßlich - die bekommt 
man auch mit JSON nicht übersichtlich.

Mein erster Versuch ging schief:
1
eval(File.open('./options.rb').read)

Es gibt das Ergebnis der letzten Zuweisung zurück, aber keine der 
Variablen war hinterher bekannt - weiß der Teufel, warum.

Der zweite Versuch:
Aus jeder Variablen eine Methode bauen, die die Variable konstruiert und 
den ganzen Kladaradatsch in einen Modul verpackt. Den dann requiret und 
includet.

So gehts...
Gast
OT:
Dieses "such doch bei Google" gerufe geht irgendwann mal noch nach 
hinten los.

Mir passierts jetzt schon häufig das bei ner Suche nach einem Problem 
zwar passende Fragestellungen gefunden werden aber als Antwort nur auf 
Google verwiesen wird.

Was glaubt ihr wo die tollen Lösungen bei Google herkommen - da hat 
tatsächlich mal jemand auf eine Frage mit der Lösung geantwortet...
OP
Tek schrieb:
> Was glaubt ihr wo die tollen Lösungen bei Google herkommen - da hat
> tatsächlich mal jemand auf eine Frage mit der Lösung geantwortet...

Meine Lösung steht hier: 
Beitrag "Re: [ruby] Wie kann man Ruby-Text aus einer Datei einkopieren"

Aber ich kann dir nur voll zustimmen, gar zu oft findet man eine Frage 
mit dem Problem, das man gerade hat und am Ende vielleicht auch noch 
eine Notiz, es sei gelöst, aber wie die Lösung aussieht, wird 
verschwiegen.

Manche Leute schaffen es eben gerade mit Ach und Krach bis zum eigenen 
Bauchnabel zu denken...
(Firma: Torrox.de)
Uhu U. schrieb:
> Diese Formulierung aus dem Eingangsposting ist jedenfalls ziemlich
> eindeutig:
>
>> den Text aus options.rb wie in c includen.

Ich verstehe dann aber wirklich auch nicht, warum
1
require 'options.rb'

oder
1
include 'options.rb'

für Dich nicht funktioniert! Das sind die üblichen Wege.

Und ich denke, da ist ein Unterschied, ob jemand nur zur Nutzung einer 
Suchmaschine aufruft, oder die Suchmaschine für Dich bedient und Dir das 
Ergebnis der Suche liefert.

Und da es jetzt schon mindestens 2 Leute gibt, die Deine Frage 
offensichtlich nicht verstanden haben, könnte es auch an Deiner Frage 
liegen. Das sollte man als Fragesteller zumindest mal im Bereich des 
Möglichen behalten und nicht gleich rumpoltern, wenn die Antwort nicht 
passt!

schönen Abend,
Torsten
OP
Torsten R. schrieb:
> Ich verstehe dann aber wirklich auch nicht, warum
> require 'options.rb'
>
> oderinclude 'options.rb'
>
> für Dich nicht funktioniert!

Weil require eben nicht wie das c-include funktioniert - was ja 
keineswegs neu ist - und include in ruby nochmal was völlig anderes ist.

Wenn man Ruby nicht kennt, dann sollte man sich eine Antwort auf die 
Frage schlicht sparen und einen rotzig auf Google zu verweisen 
funktioniert eben auch nicht, um sich als den großen Crack zu 
profilieren.
Gast
Uhu U. schrieb:
> ...dann sollte man sich eine Antwort auf die
> Frage schlicht sparen und einen rotzig auf Google zu verweisen
> funktioniert eben auch nicht, um sich als den großen Crack zu
> profilieren.


...und dann gibt es noch die Leute, denen man am Besten überhaupt nicht 
antwortet, weil jede Antwort mit Widerworten und Undank quittiert 
wird.
OP
Dass diese Trivialkonstellation funktioniert, weiß ich und ich hatte 
vor, das genau so zu machen.

In der ursprünglichen options.rb wurde zunächst ein Struct-Typ definiert 
und anschließend wurden die Arrays mit solchen Structs geladen. Dazu 
noch etliche Kommentare, das wars. Die Daten enthalten teilweise 
ziemlich lange String- und Array-Literale.

Wenn ich options.rb direkt in rdebug geladen habe, konnte ich alle 
Variablen zugreifen.

Wenn options.rb per require im Hauptmodul geladen wurden, waren sie nach 
dem require nicht mehr definiert.

Eine mögliche Ursache könnten die Variablen sein: sie waren nicht global 
- also als $variable - definiert. Ich habe sporadisch Probleme mit dem 
Gültigkeitsbereich von Variablen gehabt, wenn ich Variable ohne $ auf 
Dateilevel verwendet habe.

Die Lösung: in options.rb werden die Arrays jeweils in einer Methode 
aufgebaut, die das Array als Ergebnis zurück gibt. Das Ganze in einen 
Modul verpackt und per require und include im Hauptmodul geladen.

Die Idee, das mit einer Art c-include dort zu machen, wo die Daten 
gebraucht werden, führt bei ruby in die Irre.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.