我刚学习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