2016-06-13 5 views
-2

Ich versuche nach einem Aspekt meines Objekts (Score) zu sortieren. Das habe ich bisher, aber ich bekomme Fehlermeldungen wie "undefined method score".Ruby sort_by Verwirrung

class object 
    def initialize(likes, comments, score) 
     @no_of_likes=likes 
     @no_of_comments=comments 
     @score =score 
    def calculateScore 
     #Assigns a score to each element of the array, based off of   algorithm 
     @score = (@no_of_likes + @no_of_comments) 
    end 
def sortByScore() 

    arr = [o1 =Object.new(40, 35, 0), o2 =Object.new(100, 2, 0), o3 = Object.new(1, 150, 0)] 

    for obj in arr 
     obj.calculateScore 
    end 
    #sorts by score 
    arr = ar.sort_by &:score 
    puts arr.inspect 
end 
+1

Sie haben eine '@ score'-Instanzvariable, aber keine 'score'-Methode. –

+0

Willkommen bei Stack Overflow. Bitte lesen Sie "[mcve]". Wenn Ihr Code korrekt eingerückt ist, können Sie Probleme erkennen. Ihr Code wird von Ruby nicht akzeptiert, da er mehrere 'end'-Anweisungen nicht enthält. Außerdem ist es eine sehr schlechte Idee, eine Klasse 'Objekt' zu nennen. Zuerst sollten die Klassen CamelCase sein, also wäre es "Object", aber es gibt bereits eine Klasse [Object] (http://ruby-doc.org/core-2.3.1/Object.html), die überschrieben wird wirklich schlechte Idee. –

+0

Sie müssen wirklich diesen Code aufräumen, das ist Ruby nicht gültig. Zusätzlich hält convention fest, dass Methoden Namen wie 'sort_by_score' haben und leere Argumente weggelassen werden, dh'() 'wird fast nie angegeben. Ungewohnt und chaotisch ist es auch, ungenutzte Variablen innerhalb eines Arrays zu vergeben. Darüber hinaus sollten Sie Ihre Klasse 'Objekt' nicht nennen, da' Objekt' die Basis aller Ruby-Objekte ist. – tadman

Antwort

2

Ich benannte Ihre Klasse in Obj, Objekt ist kein guter Name. Obj ist auch nicht gut. Versuchen Sie, die Klasse etwas zu nennen, das beschreibt, was Sie vorhaben (wie wäre es mit Scorekeeper?).

class Obj 
    attr_reader :score 

    def initialize(likes, comments, score) 
    @no_of_likes = likes 
    @no_of_comments = comments 
    @score = score 
    end 

    # Assigns a score to each element of the array, based off of algorithm 
    def calculateScore 
    @score = (@no_of_likes + @no_of_comments) 
    end 
end 

Beachten Sie die hinzugefügte Zeile:

def score 
    @score 
    end 

, die Ihr fehlt/nicht definierte Methode ist:

attr_reader :score 

Das äquivalent ist

arr = [Obj.new(40, 35, 0), Obj.new(1, 150, 0), Obj.new(100, 2, 0)] 
arr.map(&:score) 
=> [0, 0, 0] 

arr.each { |obj| obj.calculateScore } 
arr.map(&:score) 
=> [75, 151, 102] 

arr = arr.sort_by(&:score) 
arr.map(&:score) 
=> [75, 102, 151] 
+0

Ich komme aus der Welt von Java/Python, würden Sie sagen, dass die Linie "attr_reader: score" ist eine Art von "Getter" -Methode für den Score-Wert? –

+0

@DannyTobackdtirt - Ja. Auch attr_writer (Setter) und attr_accessor (Getter/Setter). – seph

0

Wenn Sie eine Sammlung dieser Objekte haben,

@collection.sort_by{|object| object.score} 

sollte es tun.

0
R = Struct.new(:confusion) 

Ruby = Array.new(9){R.new(rand)} 
sorted = Ruby.sort_by(&:confusion)