0

我有以下代码,我想知道是否有人可以帮助解释它是如何工作的。

我有一个非常基础的课程

class Configs
  attr_accessor :config_files

  def initialize(*config_files)
    @config_files = config_files
  end
end


configs = Configs.new('config.txt','config1.txt')

configs.each { |c| puts c }

config.txt
config1.txt
=> ['config.txt', 'config1.txt']

ifconfigs是一个Configs实例,该方法如何each找到里面的数组?

4

2 回答 2

1

因为您在执行该行时使用*config_files了创建数组的configs = Configs.new('config.txt','config1.txt')。你Configs.new调用了actaully Class#new,它也调用了你的#initialize方法,你使用了splatted参数。一个简单的演示

*a = 1,2,3
a # => [1, 2, 3]

更正的代码

class Configs
  attr_accessor :config_files

  def initialize(*config_files)
    @config_files = config_files
  end
end


configs = Configs.new('config.txt','config1.txt')

configs.config_files.each {|c| puts c}

# >> config.txt
# >> config1.txt
于 2013-10-16T17:26:57.093 回答
1

您的代码不像显示的那样工作:

class Configs
  attr_accessor :config_files

  def initialize(*config_files)
    @config_files = config_files
  end
end

configs = Configs.new('config.txt','config1.txt')

configs.each { |c| puts c }
# ~> -:12:in `<main>': undefined method `each' for #<Configs:0x007f8a41899810> (NoMethodError)

您需要将其更改为:

configs.config_files.each { |c| puts c }
# >> config.txt
# >> config1.txt

configs是你的Configs类的实例。(实际上你应该调用它Config,因为一个类更可能是某事的一次出现,并且config作为该类的单个实例。)

configs有一个实例变量@config_files,它是一个数组。有一个config_files访问器返回该实例变量。

Usingconfigs.config_files返回一个对 的引用@config_files,它确实有一个each方法,因为它是一个数组。

于 2013-10-16T18:37:54.463 回答