添加到Ruby对象

我一直在读Ruby。 就像语言的简单化一样。 我一直在努力查找,并自己解决。 我正在寻找对象的一些帮助以及我如何向它添加数据。 我想创建一个名为Athlete的Object,我从.txt或.csv文件中读取它们的Jersey号和名称。

class Athlete def setNumber (jNum) @mynum = jNum end def getNumber return @mynum end def setName (jName) @myname = jName end def getName return @myname end end 

那是我怎么设置课程的?

然后我在文件中读到:

 myAthlete = Athlete.new fileObj = File.new(uInput, "r") while (line = fileObj.gets) jData = line.split(" ") myAthlete.setNumber(jData.at(0)) myAthlete.setName(jData.at(1)) end fileObj.close 

这是我开始有点迷失的地方。 我知道它可以完美地分割数据,因为我已经尝试过只使用Array.new – 也就是说,我正在尝试将这个数组放在Athlete类中。 有人可以帮助我吗?

所以,如果我的输入文件是:

 52 Sabathia 19 Tanaka 17 Holliday 24 Sanchez 

我希望它分裂,然后如果我打电话让我们说你的myAthlete(1)它打印出Tanaka的东西

关于Ruby的问题在于它是如何清晰的语法以及如何驱动许多Ruby样式约定。 例如,Ruby建议不要使用getset方法,而是更喜欢namename= for accessor和mutator方法。

是的,您可以在方法名称的末尾加上= ,就像您可以拥有的那样? 或者! ,每一个都意味着特定的东西。

这也是给定的,你在方法中执行的最后一个操作是隐式返回值,因此不需要return

以下是对代码的简单重构:

 class Athlete def number @number end def number=(value) @number = value end def name @name end def name=(value) @name = value end end 

您可以进一步减少这一点,因为Ruby有一个方法可以自动为您生成这些名为attr_accessor 。 您还可以通过initialize方法填充以下内容,让您的生活更轻松:

 class Athlete attr_accessor :number attr_accessor :name def initialize(number, name) @number = number @name = name end end 

所以把这一切放在一起:

 athletes = [ ] File.readlines(input) do |line| number, name = line.chomp.split(/\s+/) athletes << Athlete.new(number, name) end 

许多Ruby代码使用来定义应该发生的操作。 在这种情况下, readlines调用阻塞从文件读取的每一行。 这些行包括chomp删除后的\n换行符。 <<是一种向数组附加内容的快速方法。

尽量保持变量和方法名称都是小写的。 jData在Ruby中具有重要意义,因此jData应该是jdataj_data

更新 :为了使这个更适合调试器:

 class Athlete def inspect "Athlete [%s] %s" % [ @number, @name ] end end 

首先,您不需要定义显式的getter / setter。 像这样的东西会做

 class Athlete attr_accessor :name, :number def initialize(name, number) self.name = name self.number = number end end 

甚至更短:

 Athlete = Struct.new(:name, :number) 

然后创建运动员:

 athletes = File.foreach(file_path).map do |line| number, name = line.chomp.split(' ') Athlete.new(name, number) end 

你现在将拥有一个充满Athlete的arrays。