添加到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建议不要使用get
和set
方法,而是更喜欢name
和name=
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
应该是jdata
或j_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。