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 的类系统更令人沮丧的事情之一。即使对于子类,类变量的隐私也是如此。无论如何,解决问题的直接方法是添加一个类方法,如下所示:

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