Метод класса не оценивается NoMethodError

Я не понимаю, почему я получаю NoMethodError, когда пытаюсь вызвать метод класса "addStudent". Я добавил self для перехода от экземпляра к методу класса и трижды проверил свой синтаксис, чтобы убедиться, что я имею в виду правильный объект.

Я выполнил простую установку как объекта школы, так и метода, и оба они относятся к одному и тому же экземпляру класса School. Вот код.

class School
   attr_accessor :name, :location, :instructors, :students
   attr_reader :ranking
   @@SCHOOLS = []


    def initialize(name, location, ranking, students, instructors)
       @name = name
       @location = location
       @ranking = ranking
       @students = students
       @instructors = instructors
       @@SCHOOLS << self
    end

    def self.setRanking= (ranking)
       @ranking = ranking
    end

    def self.addStudent= (name, grade, semester)
       @students << {:name => name, :grade => grade, :semester => semester}
    end


    def self.removeStudent(name)
         @students.delete_if { |student_hash| student_hash[:name] == name }
    end
end

 school = School.new ("Happy Funtime School", 
"NYC", 
1, 
[   {:name => "Marissa", :grade => "B"},
    {:name=>"Billy", :grade => "F"},
    {:name => "Frank", :grade => "A"},
    {:name => "Sophie", :grade => "C"}  ],
[ 
    {:name=>"Blake", :subject=>"being awesome" },
    {:name=>"Ashley", :subject=>"being better than blake"},
    {:name=>"Jeff", :subject=>"karaoke"}
                                        ]    

)

school.addStudent("Jesus", "Z", "Y")

ОШИБКА:

 rb:114:in `<main>': undefined method `addStudent' for #<School:0x007fca64099ff8> (NoMethodError)

person user3667382    schedule 26.07.2014    source источник
comment
Просто чтобы добавить больше ясности (или, возможно, больше путаницы), вы создали school через school = School.new... school (нижний регистр) — это объект экземпляра, а не класс, поэтому ему нужны методы экземпляра, а не методы класса.   -  person SteveTurczyn    schedule 27.07.2014


Ответы (1)


  1. Вы сделали методы setRanking, addStudent, removeStudent методами класса, добавив к ним self.. Но вы используете метод addStudent как метод экземпляра. Удалите self., чтобы сделать их методами экземпляра.

  2. Вы звоните addStduent, но определили его как addStudent= (в конце =).


def setRanking(ranking)
  @ranking = ranking
end

def addStudent(name, grade, semester)
  @students << {:name => name, :grade => grade, :semester => semester}
end


def removeStudent(name)
  @students.delete_if { |student_hash| student_hash[:name] == name }
end
person falsetru    schedule 26.07.2014
comment
Я не вижу орфографической ошибки, когда набираю CTRL+F в Student, и я не знаю, зачем мне удалять себя. Тогда я не смогу использовать этот метод, верно? - person user3667382; 26.07.2014
comment
@ user3667382, я имею в виду: замени def self.addStudent= на def addStudent, def self.setRanking= на def setRanking. - person falsetru; 26.07.2014
comment
Хорошо. Я не понимаю, почему это решает проблему. Я думал, что буду покрыт синтаксическим сахаром Руби. :/ Спасибо хоть. - person user3667382; 26.07.2014
comment
@ user3667382, 1. метод класса -> метод экземпляра / 2. исправление опечатки. - person falsetru; 26.07.2014
comment
user3667382, вы понимаете, о чем говорит фальцет? Вот простой пример: class A; def self.cm; puts "hi"; end; def im; puts "ho"; end; end. cm используя метод класса (из-за self.); im — это метод экземпляра. Пусть a будет экземпляром A: a=A.new. Затем A.cm => "hi", a.im => ho, но A.im => NoMethodError: undefined method 'im' for A:Class и a.cm => undefined local variable or method 'a' for main:Object. - person Cary Swoveland; 26.07.2014