Programmieren eines Basis-Rechner in Ruby
Dies ist mein Erster Ausflug in die computer-Programmierung. Ich habe gewählt, um zu erfahren, Ruby, und ich genieße es durchaus ein wenig. Allerdings bin ich ein wenig verwirrt, warum die Antwort nicht korrekt ausgegeben in diesem Stück code.
def addition_function
puts "Which numbers would you like to add?"
@n1 = gets.chomp
@n2 = gets.chomp
@n1 + @n2 == @answer
puts "The sum is... #{@answer}"
end
def subtraction_function
puts "Which numbers would you like to subtract?"
@n1 = gets.chomp.to_i
@n2 = gets.chomp.to_i
@n1 - @n2 == @answer
puts "The answer is... #{@answer}"
end
def multiplication_function
puts "Which numbers would you like to multiply?"
@n1 = gets.chomp
@n2 = gets.chomp
@n1 * @n2 == @answer
puts "The answer is... #{@answer}"
end
puts "Would you like to [add], [multiply], or [subtract]?"
response = gets.chomp
if response == "add" then
addition_function
end
if response == "subtract" then
subtraction_function
end
if response == "multiply" then
multiplication_function
end
Ich weiß, dies ist wahrscheinlich schrecklich-code... aber könnte mir jemand helfen, lenken mich in die richtige Richtung?
Sie nicht brauchen, um suffix Ihre Methoden mit
Der code ist nicht richtig eingerückt, brauchen Sie NICHT
_function
. Es geht mit def
ist, wie Sie erstellen von Methoden. Es ist unnötig.Der code ist nicht richtig eingerückt, brauchen Sie NICHT
then
im if
- Klausel und Sie aufrufen werden sollte to_i (Umwandlung von string zu integer) wenn Sie möchten, arithmetische OperationenInformationsquelleAutor RogueWav | 2013-12-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Betrachten Sie diesen code:
Die Idee ist, Folgen Sie den "DRY" - Prinzip: "TROCKEN" bedeutet "Don' T Repeat Yourself", die die überwiegende Mehrheit der Zeit, ist eine wirklich gute Sache.
Zur Vermeidung von Schreibfehlern, ich würde empfehlen etwas wie:
ändern Sie dann die
when
Klauseln, die mit dem ersten Buchstaben des gewünschten Vorgang.Die Arbeit, es sei denn
response
leer ist. Sie können herausfinden, wie damit umzugehen ist.Dass ist wahr, aber hier ist der Grund, warum ich Refactoring der code wie ich es gemacht habe: Wenn, aus irgendeinem Grund, gab es eine Notwendigkeit für den Betrieb auf mehr als zwei Werte hat nur eine Sache verändert werden:
werden könnte:
Oder, besser, umgewandelt werden könnte, um so etwas wie:
Sonst nichts ändern, außer, um herauszufinden, wie viele Werte benötigt werden.
Nun, zu tun, es allen Recht würde erfordern unterschiedliche text-weist den Benutzer, dass mehrere Werte zu erwarten sind, aber das ist leicht getan, indem damit die Benutzer sagen, wie viele Sie eingeben möchten, und dann prompt für jede
gets
:inject
skalieren kann einfach weil es nicht Voraus, dass das wissen über die Anzahl der Werte betrieben wird.Es wurde absichtlich gemacht, aber ich mag dieses besser:
answer
einmaloperator
bestimmt wird, istanswer = gets.to_i.send(operator, gets.to_i)
. Verständnissend
sollte in der Nähe der Spitze der Liste für das lernen von Ruby.Vielen Dank für das feedback. Es erstaunt mich, wie viel einfacher und eleganter ist dieser code zu dem, was ich geschaffen...
ja,
send
ist eine Möglichkeit, aber nicht gut skalieren, wenn das problem Veränderungen zun
Anzahl der Werte verarbeitet werden. Siehe das edit zur Antwort.Ruby ist eine tolle kleine Sprache. Es ist sehr ausdrucksstark und macht es einfach zu schreiben in einer Reihe von verschiedenen Stilen; ich habe geschrieben, die in viele verschiedene Sprachen im Laufe der Jahre, und Ruby erstaunt mich mit seiner Eleganz und wie schön es können Dinge brechen.
Ich denke
with_index
imn.times.map.with_index
ist ein Artefakt, das Sie vergessen haben zu löschen. Antworten nicht reqd. Löschen Sie diesen Kommentar.InformationsquelleAutor the Tin Man
Ihre Aufgaben sind auf der falschen Seite der Aussage. Sollten Sie
answer = n1 * n2
,das ist nicht das gleiche wie
answer == n1 * n2
(dies ist eine Prüfung auf Gleichheit mit==
). Der Ausdruck geht immer auf der rechten Seite, und der Variablen das Ergebnis zugewiesen wird, geht auf der linken Seite-das ist ziemlich universell, aber nicht unbedingt intuitiv aus der algebra.Auch: mit einem
@
vor den Namen einer Variablen unterscheidet es als Instanz variable oder Element einer Klasse sein. Von dem, was Sie hier gezeigt haben, die Sie nicht brauchen, schließen diejenigen ein, die normalerweise nur den Gültigkeitsbereich von Variablen erforderlich sind, die für diesen Einsatz.Check-out diese Frage mehr auf das Teil.
InformationsquelleAutor Kyle Travis
Dem " @ " - Siegel wird verwendet, um anzugeben, dass eine Klasse-Instanz-variable, Sie haben keine Klasse, so verwenden Sie es nicht.
Ist ein boolescher Ausdruck der Bewertung, ob @n1 + @n2 ist gleich @Antwort.
Wird es zu true oder false ausgewertet.... aber Sie arbeiten nicht mit der Antwort.
Was Sie wollen, ist ...
Empfehle ich Ihnen immer ausführen von Ruby mit der -w option. Es erspart Ihnen sehr viel Kummer.
Bitte einzurücken "Ende"'s übereinstimmen, den "def" (oder "falls").
Wiederholung n1 = bekommt.chomp.to_i alle über dem Platz, tun Sie es einmal, und übergeben Sie die Antworten als parameter...
InformationsquelleAutor John Carter
Ein paar Vorschläge, die nicht von anderen erwähnt:
Verkürzen Ihre Methode (nicht "funktionieren") - Namen und Verben verwenden (z.B.
add
stattaddition_method
).Als auch mit lokalen Variablen eher als Instanz-Variablen (von anderen erwähnt), entfernen Sie Sie, wo Sie können. Zum Beispiel könnten Sie vereinfachen
.
zu
Bemerken, ich habe die Ruby-Konvention von zwei Leerzeichen Einrücken.
Brauchen Sie nicht
chomp
hier (obwohl es nicht schadet), weil"123followed by \n or any other non-digits".to_i => 123
.Einen
case
Aussage gut funktionieren würde, am Ende (und lassen Sie ' s Durchlaufen, bis der Benutzer quit):.
oder nur
chomp
. Sie ersetzen könnteloop do
mitwhile true do
oder andere äquivalente Konstrukte.InformationsquelleAutor Cary Swoveland
Klasse Calculator
def Calc
starken text puts "geben Sie einen operator Ihrer Wahl (add,sub,mul,div,mod)"
operator = wird.chomp
Ende
Ende
Ende
obj= Rechner.neue
$f=obj.Calc
InformationsquelleAutor roshan
Sind Sie mit
@n1 + @n2 == @answer
zu versuchen, und setzen Sie die Antwort. Was Sie tun möchten, ist@answer = @n1 + @n2
.=
ist die Zuordnung==
ist ein Vergleichsoperator.Außerdem werden Sie brauchen, um
@n1 = gets.chomp.to_i
. Das wird konvertieren Sie Ihre Eingabe in einen integer aus einem string. Das mit@n2
als gut.Du auch nicht brauchen, um verwenden Sie die
@
vor jeder der Variablen. Das sollte nur verwendet werden, wenn Sie den Umgang mit Klassen, die Sie scheinbar nicht tun.InformationsquelleAutor Justin Wood
InformationsquelleAutor محمد علام
InformationsquelleAutor Rhea Lynn Urmeneta
InformationsquelleAutor Anoob K Bava