简体   繁体   中英

Ruby “Undefined Method” for class method

Ruby beginner struggling to simply print out the value of this @@people hash to the console

class Person
  #have a first_name and last_name attribute with public accessors
  attr_accessor :first_name 
  attr_accessor :last_name

  #have a class attribute called `people` that holds an array of objects
  @@people = []

  #have an `initialize` method to initialize each instance
  def initialize( first_name, last_name )#should take 2 parameters for first_name and last_name
    #assign those parameters to instance variables
    @first_name = first_name
    @last_name = last_name
    #add the created instance (self) to people class variable
    @@people.push self
  end

  #have a `search` method to locate all people with a matching `last_name`
  def self.search( last_name )
    #accept a `last_name` parameter
    @search_name = last_name
    #search the `people` class attribute for instances with the same `last_name`
    @@people.select {|last_name, value| value == "Smith"}.to_s
    #return a collection of matching instances
  end

  #have a `to_s` method to return a formatted string of the person's name
  def to_s
    #return a formatted string as `first_name(space)last_name`
    self.each { |first_name,last_name| print "#{first_name} #{last_name}" }
  end

  def print_hash
    p @@people
  end

end

p1 = Person.new("John", "Smith")
p2 = Person.new("John", "Doe")
p3 = Person.new("Jane", "Smith")
p4 = Person.new("Cool", "Dude")

#puts Person.search("Smith")
puts Person.print_hash
# Should print out
# => John Smith
# => Jane Smith

You defined print_hash as an instance method. To be able to call it like People.print_hash define it this way: def self.print_hash

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM