2016-10-05 92 views
-1

所以我写了这段代码,它在我把学生放在课堂外并传递学生参数进行搜索时起作用。但是当我尝试像这样运行时,它说学生是未定义的。我觉得我应该使用初始化方法,但我无法弄清楚如何使用它在这种情况下Ruby对象初始化

class Student 

def search(name) 
i = 0; 

    students = [ 

    {:firstname => "John", :lastname => "LastnameJohn", :phonenumber => 123456789}, 

    {:firstname => "Ken", :lastname => "Lastnameken", :phonenumber => 456734244}, 

    {:firstname => "Marisa", :lastname => "lastnamemarisa", :phonenumber => 443234567}, 
    {:firstname => "Ken", :lastname => "Kenlastname", :phonenumber => 456734244} 
    ] 

    while i < students.length 
    if(students[i][:firstname] == name) 
     puts students[i] 
    end 
    i = i + 1; 
    end 
end 
end 

a = Student.new 
a.search("John") 

回答

0

你不应该这样定义一个方法内部列表。要么你应该让他们进来,或者你应该让他们在另一个班级或模块中定义。

例如:

students = [ 
    {:firstname => "John", :lastname => "LastnameJohn", :phonenumber => 123456789}, 
    {:firstname => "Ken", :lastname => "Lastnameken", :phonenumber => 456734244}, 
    {:firstname => "Marisa", :lastname => "lastnamemarisa", :phonenumber => 443234567}, 
    {:firstname => "Ken", :lastname => "Kenlastname", :phonenumber => 456734244} 
] 

class Student 
    def initialize(list) 
    @list = list 
    end 

    def search(name) 
    @list.select do |student| 
     student[:firstname] == name 
    end.each do |student| 
     puts student.inspect 
    end 
    end 
end 

a = Student.new(students) 
a.search("John") 

它使用Enumerable方法select筛选出你感兴趣的,而不是你原来的代码行。

+0

,什么是做|学生|?对不起,我刚开始学习Ruby。我很困惑 –

+0

通读我已链接到的Enumerable文档。它解释了很多很多的例子。 'do | ... |'表示法是你如何调用一个块,类似于JavaScript中的'function(...){}'。 – tadman

+1

块技术起初可能非常不寻常,但它确实是大多数Ruby代码的中坚力量。花一些时间试验它是如何工作的以及它的局限性。 – tadman

0

你的程序是正确的。我运行它时没有收到任何错误消息。然而,由于students永远不会改变它的价值,我将其定义为类的常量成员:

class Student 

    STUDENTS = [ .... ] 

    def search(name) 
     .... # do something with STUDENTS 
    end 

end