2016-06-13 125 views
-2

我想按我的對象(分數)的某個方面進行排序。這是我迄今爲止,但我收到的錯誤消息,如「未定義的方法評分」。Ruby sort_by混淆

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

您有'@ score'實例變量,但沒有'score'方法。 –

+0

歡迎來到Stack Overflow。請閱讀「[mcve]」。如果你的代碼正確縮進,它會幫你找出問題。你的代碼不會被Ruby接受,因爲它缺少多個'end'語句。另外,調用一個類「對象」是一個非常糟糕的主意。首先,類應該是CamelCase,所以它應該是Object,但已經有一個[Object](http://ruby-doc.org/core-2.3.1/Object.html)類,並且覆蓋它是一個真是糟糕的主意。 –

+0

你確實需要清除這段代碼,這不是有效的Ruby。此外,約定認爲方法有'sort_by_score'這樣的名稱,而空參數被省略,即'()'幾乎從不指定。在數組內部分配未使用的變量同樣令人困惑和混亂。最重要的是,不要調用你的類'object',因爲'Object'是所有Ruby對象的基礎。 – tadman

回答

2

我把你的類改名爲Obj,對象不是一個好名字。 Obj也不好。嘗試命名這個類來描述你所做的事情(如何使用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 

注意添加一行:

attr_reader :score 

這相當於:

def score 
    @score 
    end 

這是您遺漏/未定義的方法:

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

我來自Java/Python的世界,你會說 「attr_reader:score」 有點像分數值的「getter」方法嗎? –

+0

@DannyTobackdtdirt - 是的。還有attr_writer(setter)和attr_accessor(getter/setter)。 – seph

0

如果您有這些對象的集合,

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

應該做的伎倆。

0
R = Struct.new(:confusion) 

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