使用Ruby类创建哈希



我刚学习Ruby一周,就不明白我在这段代码中正确地做了什么。

class Address
attr_accessor :type, :street, :city, :state
def initialize (type, street, city, state)
@type = type
@street = street
@city = city
@state = state
end
def show
puts "Address.show: #{type}"
puts "#{self.street} n #{self.city}, #{}self.state}"
end
end
class Person
attr_accessor :first, :last, :address_list
def initialize (first, last)
@first = first
@last = last
@address_list = Address.hash {}
end
def show
puts "From Person.show"
puts "#{self.first} #{self.last}"
#puts @addresses.keys
end
def address(addr)
@key = addr.type
@address_list[@key] = addr    # FAILS HERE 
puts @address_list.keys
puts @address_list[@key]
end
end
# Test
puts "Creating Person"
person=Person.new("Bob","Jones")
person.first="Robert"
person.show
puts "Creating Addresses"
addr1 = Address.new("home", "3103 Hayward St", "Bellingham,","WA")
addr2 = Address.new("work", "123 Main Street", "Hillsdale,","OR")
puts "Adding addresses to person"
person.address(addr1)
person.address(addr2)
puts "Showing Addresses"
addr1.show
addr2.show
puts "Showing Person"
person.show

我已经根据@Arun的建议对他进行了更改,但我仍然收到以下消息:F:/MyDocs/ruby/Contacts//perse.rb:32:inaddress': undefined method[]='for 1049615506:Integer(NoMethodError(

Address.hash返回对象(在本例中为类Address(的整数哈希值。您应该将@address_List设置为空哈希。

@address_List = {}

puts @addresses[key]

应该是

puts @address_List[@key]

Ruby中的惯例是使用snake_case作为变量名。因此,address_List将是address_list

您遇到的问题是由分配给address_list引起的Address.hash返回一个整数。有关详细信息,请参阅本页。你可能想要的是@address_list = {}

def initialize (first, last)
@first = first
@last = last
@address_list = Address.hash {}  # this calls the hash method on Address which returns an integer
end

这几乎是阿伦在回答中所说的,但也许你错过了第一部分?这是对我来说运行良好的更新代码。

class Address
attr_accessor :type, :street, :city, :state
def initialize (type, street, city, state)
@type = type
@street = street
@city = city
@state = state
end
def show
puts "Address.show: #{type}"
# puts "#{self.street} n #{self.city}, #{}self.state}"
puts "#{self.street} n #{self.city}, #{self.state}"
end
end
class Person
attr_accessor :first, :last, :address_list
def initialize (first, last)
@first = first
@last = last
# @address_list = Address.hash {}
@address_list =  {}
end
def show
puts "From Person.show"
puts "#{self.first} #{self.last}"
#puts @addresses.keys
end
def address(addr)
@key = addr.type
@address_list[@key] = addr    # FAILS HERE 
puts @address_list.keys
puts @address_list[@key]
end
end
# Test
puts "Creating Person"
person=Person.new("Bob","Jones")
person.first="Robert"
person.show
puts "Creating Addresses"
addr1 = Address.new("home", "3103 Hayward St", "Bellingham,","WA")
addr2 = Address.new("work", "123 Main Street", "Hillsdale,","OR")
puts "Adding addresses to person"
person.address(addr1)
person.address(addr2)
puts "Showing Addresses"
addr1.show
addr2.show
puts "Showing Person"
person.show

最新更新