我一直在读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 - 也就是说,我试图在运动员课程中制作数组。有人可以帮助我吗?
所以如果我的输入文件是:
52 Sabathia
19 Tanaka
17 Holliday
24 Sanchez
我希望它能分开,然后如果我打电话让我们说呃myAthlete(1)它打印出Tanaka的东西
答案 0 :(得分:5)
关于Ruby的问题是,语法是多么干净以及如何驱动许多Ruby样式约定。例如,Ruby建议使用其中包含get
和set
的方法,而不是像name
和name=
那样的访问器和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代码使用 blocks 来定义应该发生的操作。在这种情况下,readlines
调用阻塞从文件读取的每一行。这些行包含\n
删除后的chomp
换行符。 <<
是一种向数组追加内容的快捷方法。
尽量保持变量和方法名称都是小写的。首都在Ruby中具有重要意义,因此jData
应为jdata
或j_data
。
更新:为了使这个更适合调试器:
class Athlete
def inspect
"Athlete [%s] %s" % [ @number, @name ]
end
end
答案 1 :(得分:3)
首先,您不需要定义显式的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
s。