Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 未评估的类方法NoMethodError_Ruby_Class_Variables_Nomethoderror - Fatal编程技术网

Ruby 未评估的类方法NoMethodError

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

当我试图调用类方法“addStudent”时,我不明白为什么会出现命名错误。 我添加了self以将实例更改为类方法,并对语法进行了三次检查,以确保引用的对象正确

我在学校对象和方法上运行了一个简单的puts,它们都引用了学校类的同一个实例。这是密码

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