添加到Ruby对象

时间:2017-02-10 03:44:55

标签: 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 - 也就是说,我试图在运动员课程中制作数组。有人可以帮助我吗?

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

52 Sabathia
19 Tanaka
17 Holliday
24 Sanchez

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

2 个答案:

答案 0 :(得分:5)

关于Ruby的问题是,语法是多么干净以及如何驱动许多Ruby样式约定。例如,Ruby建议使用其中包含getset的方法,而不是像namename=那样的访问器和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应为jdataj_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。

的数组