Ruby 未评估的类方法NoMethodError
当我试图调用类方法“addStudent”时,我不明白为什么会出现命名错误。 我添加了self以将实例更改为类方法,并对语法进行了三次检查,以确保引用的对象正确 我在学校对象和方法上运行了一个简单的puts,它们都引用了学校类的同一个实例。这是密码Ruby 未评估的类方法NoMethodError,ruby,class,variables,nomethoderror,Ruby,Class,Variables,Nomethoderror,当我试图调用类方法“addStudent”时,我不明白为什么会出现命名错误。 我添加了self以将实例更改为类方法,并对语法进行了三次检查,以确保引用的对象正确 我在学校对象和方法上运行了一个简单的puts,它们都引用了学校类的同一个实例。这是密码 class School attr_accessor :name, :location, :instructors, :students attr_reader :ranking @@SCHOOLS = [] def i
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")
班级学校
属性访问器:名称、位置、讲师、学生
属性阅读器:排名
@@学校=[]
def初始化(姓名、位置、排名、学生、讲师)
@name=name
@位置=位置
@排名=排名
@学生
@讲师=讲师
@@学校年级::学期=>学期}
结束
def自我移除学员(姓名)
@students.delete_如果{| student_hash | student_hash[:name]==name}
结束
结束
school=school.new(“快乐时光学校”,
“纽约”,
1.
[{:name=>“Marissa”,:grade=>“B”},
{:name=>“Billy”,:grade=>“F”},
{:name=>“Frank”,:grade=>“A”},
{:name=>“Sophie”,:grade=>“C”}],
[
{:name=>“Blake”,:subject=>“非常棒”},
{:name=>“Ashley”,:subject=>“比blake好”},
{:name=>“杰夫”,:subject=>“卡拉OK”}
]
)
学校。addStudent(“耶稣”,“Z”,“Y”)
错误:
rb:114:in `<main>': undefined method `addStudent' for #<School:0x007fca64099ff8> (NoMethodError)
rb:114:in`:#的未定义方法'addStudent'(NoMethodError)
setRanking
,addStudent
,removeStudent
作为类方法,方法是在它们前面加上self.
。但是您正在使用方法addStudent
作为实例方法。删除self.
将它们作为实例方法addStduent
,但将其定义为addStudent=
(尾随=
)def setRanking(排名)
@排名=排名
结束
学生(姓名、年级、学期)
@学生姓名::年级=>年级::学期=>学期}
结束
def removeStudent(名称)
@students.delete_如果{| student_hash | student_hash[:name]==name}
结束
当我按CTRL+F键输入“Student”时,我没有看到拼写错误,我也不知道为什么要删除self。那么我就不能使用这个方法了,对吗?@user3667382,我的意思是:用def-self.addStudent=
替换def-addStudent
,def-self.setRanking=
替换def-setRanking
。好的。我不明白这为什么能解决问题。我以为我会被Ruby的“语法糖”所覆盖。谢谢。@user3667382,1。类方法->实例方法/2。打字错误。用户3667382,你明白falsetru在说什么吗?这里有一个简单的例子:class a;def self.cm;把“嗨”;结束;def-im;加上"ho",;结束;结束
cm
us类方法(因为self.
)im
是一种实例方法。让a
成为a
的实例:a=a.new
。然后A.cm=>“hi”
,A.im=>ho
,但是A.im=>NoMethodError:A:Class
的未定义方法“im”和A.cm=>的未定义局部变量或main:Object的方法“A”
。只是为了更清楚(或者更混乱)您通过school=school创建了school
。新建…
school
(小写)是实例对象,而不是类,因此它需要实例方法,而不是类方法。
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