2016-06-13 2 views
-2

Я пытаюсь сортировать по аспекту моего объекта (оценка). Это то, что у меня есть до сих пор, но я получаю сообщения об ошибках, такие как «неопределенный счет метода».Ruby sort_by confusion

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

Добро пожаловать в переполнение стека. Пожалуйста, прочитайте «[mcve]». Если ваш код был правильно отступом, это поможет вам разобраться в проблемах. Ваш код не будет принят Ruby, потому что ему не хватает нескольких операторов 'end'. Кроме того, это действительно плохая идея вызвать класс 'object'. Во-первых, классы должны быть 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) 
Смежные вопросы