2014-07-26 22 views
0

我不明白爲什麼我在嘗試調用類方法「addStudent」時遇到NoMethodError。 我添加了自我從一個實例更改爲一個類方法,我三重檢查我的語法,以確保我指的是正確的對象。類方法尚未評估NoMethodError

我已經對學校對象和方法都運行了一個簡單的提示,它們都指的是學校類的相同實例。這是代碼。

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) 
+0

只是爲了增加更多的清晰度(或者更混亂)你通過'學校= School.new創建'school' ...''school'(小寫)是一個實例對象,而不是類,所以它需要實例方法,而不是類方法。 – SteveTurczyn

回答

2
  1. 你所做的方法setRankingaddStudentremoveStudent爲類方法,通過與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 
+0

我在CTRL + F鍵入「學生」時看不到拼寫錯誤,我不知道爲什麼我想刪除自己。那我就無法使用這個方法了吧? – user3667382

+0

@ user3667382,我的意思是:用'def addStudent'替換'def self.addStudent =',用'def setRanking'替換掉def self.setRanking ='。 – falsetru

+0

好的。我不明白爲什麼這可以解決這個問題。我想我會被Ruby的「語法糖」所覆蓋。 :/謝謝。 – user3667382