1

クラス変数のチュートリアルを読んでRubyを学ぼうとしています。

コードは「Worker」オブジェクトを作成し、クラス変数は、ユーザーが最後に作成したWorkerのインスタンスを追跡するために作成されます。

著者からコードをコピーしましたが、エラーが発生します:

undefined method `latest' for Worker:Class (NoMethodError)

私が見つけたコードは次のとおりです。

class Worker
  attr_writer :number_of_jobs

  def initialize(name, job)
    @name = name
    @job = job

    @@latest = @name
    @@job = @job
    puts "Lets get started"
  end

  def new_job(job)
    @job = job
    puts "I moved to #{job}!"
    self.fetch_info
  end

  def name_update(name_new)
    @name = name_new
    puts "My new name is #{name_new}."
    self.fetch_info
  end

  def fetch_info
    puts "I'm #{@name} in #{@location}."
  end

  def job_score
    return "#{@number_of_jobs * 10}Fg"
  end


  protected
  def are_you_worker?(guest_name)
    puts "Yes #{guest_name}, I am a worker!"
    return true
  end

  private
  def text_a_message(message)
    puts message
  end

  public
  def tell_friend(where)
    text_a_message("I just applied to #{where}")
  end
end

#running the code
Worker1 = Worker.new("Steve", "Support")
Worker2 = Worker.new("Alan", "PA")
puts Worker.latest

誰かが理由を見ることができますか?

4

2 に答える 2

2

クラス変数はこのクラス内でプライベートであるため、問題が発生しています。したがって、Worker.latest変数にアクセスすると、クラス外のインスタンスからは表示されないため、エラーが発生します(ただし、作成および設定されます)。

さらに、属性はクラスではなくオブジェクトの一部であるため、このクラスの属性は使用しないでください。ネイティブRubyでは、クラスメソッドを除いて外部からクラス変数にアクセスすることはできません(Railsにはそれらの拡張機能があります)。

お役に立てば幸い

于 2013-01-21T18:00:36.857 に答える
1

私見ですが、これは Ruby のクラス システムで最も苛立たしいことの 1 つです。クラス変数のプライバシーは、サブクラスに対しても当てはまります。いずれにせよ、問題の即時の解決策は、次のようなクラス メソッドを追加することです。

class Worker
  def self.latest
    @@latest
  end
end
于 2013-01-21T18:07:34.903 に答える