如何将对象添加到另一个类? (红宝石)

时间:2014-11-10 01:30:27

标签: ruby class object

我有一个任务(这意味着我必须对我使用的方法非常严格)。

所以我有这个模拟文件的类文件。它所做的只是 - 它包含nil或单个字符串,或单个符号,或单个数字或单个布尔值(true / false)。所以我有一个initializes文件的方法,我也有一个方法data_type来确定文件内容的类型(#class),getter / setter等等。

我也有这个class Dictionary,其中可能包含其他目录和文件。我应该在其中包含以下方法:

  • add_file(name, file) - 添加名为name的文件。 file应该是class File的对象,但我们无需检查输入对象是否真的属于此类。

  • add_directory(name, directory) - 添加名称为name的目录。 directoryclass Directory的对象。它可能会被遗漏,在这种情况下会创建一个空目录。

等等..等等。

我已经完成了所有class File方法,但我在class Directory中提到我提到的两种方法时遇到了问题。它们有很多相似之处,所以对add_file(name, file)的评论应该足够了。

我能想到的只是name = File.new,但它不仅不起作用,而且还遗漏了file我完全不知道是什么的事情。

def add_file(name, file)
  name = File.new
  @name = name
end

这当然是非常不正确的,但我只能想到。

感谢所有帮助。谢谢!我很抱歉问这么愚蠢的问题。

请记住,这只是模拟!这些文件不是实际文件。 file只是一个适合的随机名称。我非常怀疑我应该require任何事情!

编辑:我的一位朋友提到该文件可能已经存在。我可能只需要将其与此name匹配。但是......我仍然非常困惑。

EDIT2:@files[name] = file并且@files为哈希值的内容?

1 个答案:

答案 0 :(得分:1)

您可能希望将类File更改为其他名称,因为已有File类。

我猜任何方式都是这样的:

好的,所以我重新阅读了你的操作,并意识到字典是一个拼写错误,因此重新编写代码,因此它现在类似于:

class Directory
  attr_accessor :name,:store

  def initialize name
    self.name = name
    self.store = {}
  end

  def add_file(file)
    self.store[file.name] = file
  end

  def add_directory(directory)
    self.store[directory.name] = directory
  end

  def [](name)
    self.store[name]
  end

end

class File
  attr_accessor :name, :content, :data_type

  def initialize name,content = nil,data_type = nil
    self.content = content
    self.name = name
    self.data_type = data_type || content.class
  end

end

然后你可以做

file1 = File.new('hw.rb','puts "hello world!"', 'ruby file')
file2 = File.new('gbw.rb','puts "good bye world!"', 'ruby file')
root = Directory.new('root')
rb = Directory.new('rb')
rb.add_file(file1)
root.add_file(file2)
root.add_directory(rb)

puts root['rb']['hw.rb'].content

如果您在add_fileadd_directory方法中使用了splat运算符参数,则可以通过参数进行迭代并添加每个文件,以便您可以像

一样使用它
file1 = File.new('hw.rb','puts "hello world!"', 'ruby file')
file2 = File.new('gbw.rb','puts "good bye world!"', 'ruby file')
root = Directory.new('root')
root.add_file(file1,file2)

研究'ruby splat operator arguments'以了解我的意思