2016-04-08 4 views
0

Ich betrachte diesen Code:obj.method (Argument)

class Student 
    attr_accessor :first_name, :last_name, :age 
    def initialize(first, last, age) 
    @first_name = first 
    @last_name = last 
    @age = age 
    end 

    def birthday 
    @age += 1 
    end 
end 

class ViewStudent 
    def initialize(student) 
    @student = student 
    end 

    def do_something 
    puts "Student name: #{@student.first_name} #{@student.last_name}" 
    end 
end 

class UpdateStudent 
    def initialize(student) 
    @student = student 
    end 

    def do_something 
    puts "What is the student's first name?" 
    @student.first_name = gets.chomp 
    puts "What is the student's last name?" 
    @student.last_name = gets.chomp 
    puts "Updated student: #{@student.first_name} #{@student.last_name}" 
    end 
end 

choices = [ViewStudent, UpdateStudent] 

student = Student.new("John", "Doe", 18) 

puts "Select 1 to view student or 2 to update student." 
selection = gets.chomp.to_i 
obj = choices[selection - 1] 
obj = obj.new(student) 
obj.do_something 

In den letzten fünf Zeilen, ich verstehe, dass selection = gets.chomp.to_i die Auswahlmöglichkeiten auf ganze Zahlen konvertiert, aber wie funktioniert das im Tandem mit obj = choices[selection - 1]?

Ich bin mir auch nicht sicher, was obj = obj.new(student) und obj.do_something tun. Es sieht so aus, als ob eine lokale Variable gesetzt wird, um ein neues Objekt mit Student als Argument zu erstellen. obj ist jedoch keine Klasse oder Methode zum Anrufen?

Ich kann auch feststellen, dass obj.do_something ruft die Methoden für beide definiert ViewStudent und UpdateStudent die Auswahl gegeben.

Ich sah this, aber es beantwortet meine Frage nicht.

Antwort

0

obj = choices[selection - 1] Wählen Sie einfach ViewStudent wenn 1 und UpdateStudent wenn 2 von Ihrem Array nach Index (Auswahl [0] oder Auswahl [1]).

Sie dann eine Instanz der ausgewählten Klasse (ViewStudent.new oder UpdateStudent.new) und rufen do_something Verfahren in dieser Instanz zu schaffen, weil diese methos in beiden Klassen difined:

obj = choices[selection - 1] # obj is ViewStudent or UpdateStudent class 
obj = obj.new(student) # obj is ViewStudent or UpdateStudent instance 
obj.do_something # call `do something` method on instance 
+0

Vielen Dank! Ich habe den negativen/umgekehrten Weg vergessen, in einem Array zu zählen. Was obj = obj.new (Student) und obj.do_something ist das, wenn Sie meinen, indem Sie eine Instanz der ausgewählten Klasse erstellen? –

+1

@AlexPho: Es ist gut, dass Sie sich jetzt daran erinnert haben, aber Rückwärtsindexierung hat damit nichts zu tun. Die '- 1' ist da, um 1-basierte Benutzereingabe (1 oder 2) in 0-basierten Array-Index (0 oder 1) zu konvertieren –

+0

@SergioTulentsev Ich sehe, in der Theorie mit dieser Umwandlung zu (0 oder 1) würde es nicht möglich sein, eine dritte oder sogar vierte Wahl hinzuzufügen. Richtig? –