2016-07-14 4 views
0

Ich lerne Ruby, indem ich learnrubythehardway folge und es scheint sehr einfach und unkompliziert zu sein, bis du gefragt wirst, was bestimmte Dinge tun. Ich habe in meinem Code kommentiert, was ich glaube, geschieht in dem Programm. Wollte sehen, ob ich im Ziel bin, Dinge überdenken muss oder keine Ahnung habe und aufhören sollte zu lernen, wie man programmiert.Verstehen von IO-Methoden und -Objekten in Ruby

# Sets variables to arguments sent through terminal 
from_file, to_file = ARGV 

# Saves from_file object into in_file 
in_file = open(from_file) 
puts in_file 

# Saves from_file data into indata 
indata = in_file.read 
puts indata 

# Save to_file object into out_file with writing privileages 
out_file = open(to_file, 'w') 
puts out_file 

# Writes(copies) indata into out_file 
out_file.write(indata) 

# Closes files so they can not be accessed anymore 
out_file.close 
in_file.close 

Dies ist, was im Terminal die Ausgabe wie folgt aussieht:

#<File:0x0000000201b038> 
This is text from the ex17_from.txt file. 
Did it copy to the ex17_to.txt file? 
#<File:0x0000000201ae58> 

Wir haben auch die Aufgabe gegeben werden, um zu versuchen, die Menge an Code benötigt, zu reduzieren und gesagt, dass wir diese ganze Aktion tun in einer Zeile Code. Ich dachte mir, ich kann einfach alle Kommentare löschen und Statements einfügen, während alles andere in eine Codezeile eingefügt wird. Aber das wird eine lange Zeile sein und ich glaube nicht, dass das der Autor ist. Ideen zur Verkürzung dieses Codes sind hilfreich.

Antwort

0

Sie können FileUtils#cp verwenden und wie folgt vorgehen:

require "fileutils" 
FileUtils.cp *ARGV 

* splats die ARGV Array in zwei von cp Verfahren benötigten Parameter


Alternativ unten ist prägnante Version des Codes:

# Sets variables to arguments sent through terminal 
from_file, to_file = ARGV 

# Saves from_file object into to_file 
open(to_file, 'w') do |out| 
    open(from_file) do |f| 
     f.each do |line| 
     out << line 
     end 
    end 
end 
+0

Große alternative Lösung. Ich habe versucht, Do-Blöcke zu verwenden, aber ich bin mir nie sicher, ob es erlaubt ist. Also folge ich einfach dem Tutorial. Wie entscheidest du wann du Blöcke benutzen sollst und wann nicht? Gibt es bestimmte Zeiten, in denen ich immer einen Do-Block benutzen muss? Oder ist es was du willst, es ist nur Code? – limaBEAN

3

Ich habe in meinem Code kommentiert, was ich glaube, geschieht in dem Programm. Wollte sehen, ob ich im Ziel bin, Dinge überdenken muss oder keine Ahnung habe

Sie müssen lernen, jenseits der geschriebenen Wörter zu sehen. Zum Beispiel ist dieser Kommentar ziemlich nutzlos:

# Saves from_file object into in_file 
in_file = open(from_file) 

Nicht nur nutzlos, sondern auch inkorrekt. Was ist das from_file Objekt? Welche Art von Objekt wird in_file sein? Warum erwähnen Sie nicht open in irgendeiner Weise?

Tatsächlich passiert hier, dass ein File/IO-Objekt durch Aufruf von erstellt wird. Und from_file, in diesem Fall ist ein Pfad zu Datei. Nicht viel von einem "Objekt", oder? Aber in_file ist ein vollständiges Dateiobjekt, mit dem Sie den Inhalt der Datei lesen können.

Das gleiche gilt für den Rest Ihrer Kommentare. Sie schreiben die Codezeile einfach mit menschlichen Wörtern um, ohne die Absicht hinter dem Code zu beschreiben.

+0

Danke für die Rückmeldung. So lerne, wie man die Absicht beschreibt, verstanden. Kommentare immer durch mich aus, aber jetzt kann ich sehen, dass es ist, weil ich mich selbst abstoßen. Kennen Sie gute Referenzen, die die gesamte Computerterminologie beschreiben? Ich lese die ruby-doc.org Dokumentation durch und es scheint einfach zu sein. Aber es zu begreifen scheint für mich ein bisschen schwieriger zu sein. Ich schätze, ich muss mich besser damit vertraut machen, was alles bedeutet und wie es funktioniert. – limaBEAN

+0

@limaBEAN: Ja, genau, du brauchst nur mehr Erfahrung und Vertrautheit mit der stdlib (welche Methode macht was usw.) Wenn du auf einen Methodenaufruf stößt, den du nicht kennst, lies dir die Dokumentation durch. Das ist was ich tue und es hat bisher ziemlich gut funktioniert. :) –