2016-06-05 21 views
0
class Member 
    def initialize(name,score) 
    @name = name.capitalize 
    @score = score 
    end 

    def to_s 
    "Hello, my name is #{@name} and my score is #{@score}. Make sure to give me a good rating!" 
    end 
end 

class Contest 
    def initialize(title) 
    @title = title 
    @members = [] 
    end 

    def join(user) 
    @members << user 
    end 

    def rate_up 
    puts "#{@name} just got a rating!" 
    @score += rand(5) 
    puts "Now my score is #{@score}. WHEEEEEEEE" 
    end 

    def rate_down 
    puts "#{@name} just got a rating!" 
    @score -= rand(5) 
    puts "Now my score is #{@score}.....WTF" 
    end 

    def standing 
    if @score >= 15 
     puts "I got #{@score}! People love me!" 
    elsif @score < 15 
     puts "How did I only get #{@score}? WTF? Yall must be blind." 
    end 
    end 

    def begin 
    puts "#{@title} is about to begin! There are #{@members.size} participants this year!" 
    @members.each do |person| 
     person 
    end 
    @members.each do |person| 
     person.rate_up 
     person.rate_down 
    end 
    @members.each do |person| 
     person.standing 
    end 
    end 
end 

member1 = Member.new("jh", 6) 
member2 = Member.new("is", 8) 
member3 = Member.new("sw", 8) 
member4 = Member.new("yh", 7) 
member5 = Member.new("ws", 6) 
member6 = Member.new("sm", 5) 

contest1 = Contest.new("BestOfSIS") 

contest1.join(member1) 
contest1.join(member2) 
contest1.join(member3) 
contest1.join(member4) 
contest1.join(member5) 
contest1.join(member6) 

contest1.begin 

Wenn ich diese laufen im Terminal halten wir folgende Fehlermeldung erhalten:Rubin: NoMethodError

BestOfSIS is about to begin! There are 6 participants this year! 
2.rb:48:in `block in begin': undefined method `rate_up' for #<Member:0x007fa04b8340f8 @name="Jh", @score=6> (NoMethodError) 
    from 2.rb:47:in `each' 
    from 2.rb:47:in `begin' 
    from 2.rb:73:in `<main>' 

So vermute ich, es ist etwas falsch mit der Methode ‚rate_up‘ aber ich kann nicht herausfinden Was.

Noch eine Frage: Könnte ich das '@members'-Array initialisieren und die' Join'-Methode unter der Klasse 'Member' im Gegensatz zur Klasse 'Contest' definieren?

Vielen Dank im Voraus!

+0

Es sieht so aus als ob 'rate_up',' rate_down' und 'standing' Methoden für' Member' sind, aber sie sind in der 'Contest' Klasse. –

Antwort

2

sollten Ihre Mitglieds Klasse

class Member 
    def initialize(name,score) 
    @name = name.capitalize 
    @score = score 
    end 

    def to_s 
    "Hello, my name is #{@name} and my score is #{@score}. Make sure to give me a good rating!" 
    end 

def rate_up 
    puts "#{@name} just got a rating!" 
    @score += rand(5) 
    puts "Now my score is #{@score}. WHEEEEEEEE" 
    end 

    def rate_down 
    puts "#{@name} just got a rating!" 
    @score -= rand(5) 
    puts "Now my score is #{@score}.....WTF" 
    end 

    def standing 
    if @score >= 15 
     puts "I got #{@score}! People love me!" 
    elsif @score < 15 
     puts "How did I only get #{@score}? WTF? Yall must be blind." 
    end 
    end 
end 

und Ihren Wettbewerb Klasse sollte

class Contest 
    def initialize(title) 
    @title = title 
    @members = [] 
    end 

    def join(user) 
    @members << user 
    end 

def begin 
    puts "#{@title} is about to begin! There are #{@members.size} participants this year!" 
    @members.each do |person| 
     person 
    end 
    @members.each do |person| 
     person.rate_up 
     person.rate_down 
    end 
    @members.each do |person| 
     person.standing 
    end 
    end 
end 

jetzt

member1 = Member.new("jh", 6) 
member2 = Member.new("is", 8) 
member3 = Member.new("sw", 8) 
member4 = Member.new("yh", 7) 
member5 = Member.new("ws", 6) 
member6 = Member.new("sm", 5) 

contest1 = Contest.new("BestOfSIS") 

contest1.join(member1) 
contest1.join(member2) 
contest1.join(member3) 
contest1.join(member4) 
contest1.join(member5) 
contest1.join(member6) 

contest1.begin 

und es wird immer Ausgang

irb(main):127:0> member1 = Member.new("jh", 6) 
=> #<Member:0x007f78f175e5d8 @name="Jh", @score=6> 
irb(main):128:0> member2 = Member.new("is", 8) 
=> #<Member:0x007f78f17428d8 @name="Is", @score=8> 
irb(main):129:0> member3 = Member.new("sw", 8) 
=> #<Member:0x007f78f1729090 @name="Sw", @score=8> 
irb(main):130:0> member4 = Member.new("yh", 7) 
=> #<Member:0x007f78f1706f68 @name="Yh", @score=7> 
irb(main):131:0> member5 = Member.new("ws", 6) 
=> #<Member:0x007f78f16dd078 @name="Ws", @score=6> 
irb(main):132:0> member6 = Member.new("sm", 5) 
=> #<Member:0x007f78f16b7710 @name="Sm", @score=5> 
irb(main):133:0> 
irb(main):134:0* contest1 = Contest.new("BestOfSIS") 
=> #<Contest:0x007f78f16967b8 @title="BestOfSIS", @members=[]> 
irb(main):135:0> 
irb(main):136:0* contest1.join(member1) 
=> [#<Member:0x007f78f175e5d8 @name="Jh", @score=6>] 
irb(main):137:0> contest1.join(member2) 
=> [#<Member:0x007f78f175e5d8 @name="Jh", @score=6>, #<Member:0x007f78f17428d8 @name="Is", @score=8>] 
irb(main):138:0> contest1.join(member3) 
=> [#<Member:0x007f78f175e5d8 @name="Jh", @score=6>, #<Member:0x007f78f17428d8 @name="Is", @score=8>, #<Member:0x007f78f1729090 @name="Sw", @score=8>] 
irb(main):139:0> contest1.join(member4) 
=> [#<Member:0x007f78f175e5d8 @name="Jh", @score=6>, #<Member:0x007f78f17428d8 @name="Is", @score=8>, #<Member:0x007f78f1729090 @name="Sw", @score=8>, #<Member:0x007f78f1706f68 @name="Yh", @score=7>] 
irb(main):140:0> contest1.join(member5) 
=> [#<Member:0x007f78f175e5d8 @name="Jh", @score=6>, #<Member:0x007f78f17428d8 @name="Is", @score=8>, #<Member:0x007f78f1729090 @name="Sw", @score=8>, #<Member:0x007f78f1706f68 @name="Yh", @score=7>, #<Member:0x007f78f16dd078 @name="Ws", @score=6>] 
irb(main):141:0> contest1.join(member6) 
=> [#<Member:0x007f78f175e5d8 @name="Jh", @score=6>, #<Member:0x007f78f17428d8 @name="Is", @score=8>, #<Member:0x007f78f1729090 @name="Sw", @score=8>, #<Member:0x007f78f1706f68 @name="Yh", @score=7>, #<Member:0x007f78f16dd078 @name="Ws", @score=6>, #<Member:0x007f78f16b7710 @name="Sm", @score=5>] 
irb(main):142:0> 
irb(main):143:0* contest1.begin 
BestOfSIS is about to begin! There are 6 participants this year! 
Jh just got a rating! 
Now my score is 10. WHEEEEEEEE 
Jh just got a rating! 
Now my score is 9.....WTF 
Is just got a rating! 
Now my score is 12. WHEEEEEEEE 
Is just got a rating! 
Now my score is 9.....WTF 
Sw just got a rating! 
Now my score is 11. WHEEEEEEEE 
Sw just got a rating! 
Now my score is 7.....WTF 
Yh just got a rating! 
Now my score is 10. WHEEEEEEEE 
Yh just got a rating! 
Now my score is 6.....WTF 
Ws just got a rating! 
Now my score is 10. WHEEEEEEEE 
Ws just got a rating! 
Now my score is 9.....WTF 
Sm just got a rating! 
Now my score is 9. WHEEEEEEEE 
Sm just got a rating! 
Now my score is 6.....WTF 
How did I only get 9? WTF? Yall must be blind. 
How did I only get 9? WTF? Yall must be blind. 
How did I only get 7? WTF? Yall must be blind. 
How did I only get 6? WTF? Yall must be blind. 
How did I only get 9? WTF? Yall must be blind. 
How did I only get 6? WTF? Yall must be blind. 
=> [#<Member:0x007f78f175e5d8 @name="Jh", @score=9>, #<Member:0x007f78f17428d8 @name="Is", @score=9>, #<Member:0x007f78f1729090 @name="Sw", @score=7>, #<Member:0x007f78f1706f68 @name="Yh", @score=6>, #<Member:0x007f78f16dd078 @name="Ws", @score=9>, #<Member:0x007f78f16b7710 @name="Sm", @score=6>] 
sein sein
1

rate_up ist in der Contest-Klasse und Sie rufen sie in der Member-Klasse auf, weil @members eine Sammlung der Member-Klasse ist. Wenn Sie diese Methode in die Member-Klasse verschieben, würde Ihr Code funktionieren.

0

Für Ihre erste Frage, gibt es ein Problem mit den Methoden rate_up, rate_down und standing: Sie sind Mitglieder der Contest Klasse, und Sie versuchen, sie Instanzen auf Member anzuwenden. Verschieben Sie sie einfach zu Member und das wird in Ordnung sein.

Für Ihre zweite Frage, könnten Sie die members Array und die join Methode unter Mitglied definiert, aber Sie haben members ein Klassenattribut (@@members), so dass alle Mitglieder den gleichen Anteil zu machen.

Es ist möglich, aber nicht empfohlen, weil Sie nicht zwei Wettbewerbe gleichzeitig haben können. Außerdem ist die Trennung der Konzepte in diesem Fall schlecht, weil ein Mitglied sich nur um sich selbst und nicht über den Wettbewerb sorgen sollte.

Hoffe, das war klar und beantwortet Ihre Fragen.

Verwandte Themen