【问题标题】:Class Method Not Being Evaluated NoMethodError未评估类方法 NoMethodError
【发布时间】:2014-07-26 03:02:47
【问题描述】:

我不明白为什么在尝试调用类方法“addStudent”时会收到 NoMethodError。 我添加了 self 以从实例更改为类方法,并且我三重检查了我的语法以确保我引用了正确的对象。

我在 school 对象和方法上运行了一个简单的 put,它们都引用了 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)

【问题讨论】:

  • 只是为了更清楚(或者可能更混乱)你创建的school via school = School.new... school(小写)是一个实例对象,而不是一个类,所以它需要实例方法,不是类方法。

标签: ruby class variables nomethoderror


【解决方案1】:
  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

【讨论】:

  • 当我按 CTRL+F 输入“Student”时没有看到拼写错误,而且我不知道为什么要删除 self.那我就不能用这个方法了吧?
  • @user3667382,我的意思是:用def addStudent替换def self.addStudent=,用def self.setRanking=替换def setRanking
  • 好的。我不明白为什么这可以解决问题。我以为我会被 Ruby 的“语法糖”所覆盖。 :/ 不过谢谢。
  • @user3667382, 1. 类方法 -> 实例方法 / 2. 错字修复。
  • user3667382,你明白falsetru在说什么吗?这是一个简单的例子:class A; def self.cm; puts "hi"; end; def im; puts "ho"; end; endcm我们一个类方法(因为self.); im 是一个实例方法。让a 成为A 的一个实例:a=A.new。然后是A.cm =&gt; "hi"a.im =&gt; ho,但是A.im =&gt; NoMethodError: undefined method 'im' for A:Classa.cm =&gt; undefined local variable or method 'a' for main:Object
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多