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']

configsがインスタンスの場合、メソッドConfigsはどのようにしてeach内部の配列を見つけますか?

4

2 に答える 2

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

configsConfigsクラスのインスタンスです。Config(実際には、クラスは何かの単一の発生である可能性が高く、configそのクラスの単一のインスタンスとして呼び出す必要があります。)

configs@config_filesには、配列であるインスタンス変数 があります。config_filesそのインスタンス変数を返すアクセサーがあります。

Usingは、配列であるため、メソッドを持つへの参照をconfigs.config_files返します@config_fileseach

于 2013-10-16T18:37:54.463 に答える
1

行が実行された*config_filesときに、配列を作成したを使用しているためです。configs = Configs.new('config.txt','config1.txt')あなたConfigs.newは実際に呼び出され、メソッドClass#newも呼び出されました。ここでは、 splatted 引数#initializeを使用しました。1 つの簡単なデモ

*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 に答える