我有这个电话簿程序,它带有一个电话号码和电话号码类型(可以是你的家庭电话,手机等),这被称为标签。该程序可以获取这些值并将其存储在地址簿中,以便添加联系人,删除联系人和查找联系人。
有一个名为PhoneContact的类,它使用两个参数:电话号码和标签。这个课程的目的是接收一个电话号码和一个标签(家庭电话,工作电话,手机等),并返回它是什么类型的电话号码的输出,该号码的区号是什么等等。
一个例子是:
James_May = PhoneContact.new('(555) 555-5555', :mobile)
puts James_May.phone_number
>> (555) 555-555
puts James_May.label
>> mobile
我创建了一个能够存储,添加,删除和查找电话联系人的PhoneBook类。
这方面的一个例子是:
JG_contact = PhoneBook.new
JG_contact.add('Gary, James', '5555555555', :home)
puts "** JG's new entry:"
>> **James's new entry:
puts book.find('Gary, James')
>>(954) 111-2222 (work)
(444) 555-5555 (cell)
我的问题是我不确定如何实现phoneNumber和Label之类的变量,从PhoneNumber类到PhoneBook类。我如何使用其他类中的变量,并且在哈希中实现这些变量是否有意义?
以下是PhoneClass的代码片段:
class PhoneContact
attr_reader :label
def initialize(phone_number, label)
@label = label
@phone_number = normalize(phone_number)
end
以下是PhoneBook类的代码:
require_relative ./PhoneContact
class PhoneBook
def contactList
@contactList ||= {}
end
def add_contact (newContact = {})
flag = false
if newContact.length < 1
return flag
else
flag = true
newContact.collect do |name, number|
contactList[name] = number
end
return flag
end
end
def delete (targetName)
if !contactList.has_key?(targetName)
return false
else
contactList.delete(targetName)
return true
end
end
def display_contact (targetName)
number = -1
if contactList.has_key?(targetName)
number = contactList(targetName)
puts "Contact name : #{targetName}, Contact Number, #{number}"
else
puts "#{targetName} doesn't exist in the phonebook"
end
end
def display_all_contacts
if !contactList.empty?
contactList.each {|name, number| puts "Contact name: #{name}, contact number #{number}" }
else
puts "You don't have any contact details your phonebook"
end
end
end
答案 0 :(得分:2)
好的,所以你的困惑似乎是双重的。第一个问题是调用方法的对象。我来这里给你一个解释。假设我有这个课程A
class A
attr_accessor :b, :c
def initialize(b, c)
@b = b
@c = c
end
class << self
def alphabet
'abcdefghijklmnopqrstuvwxyz'
end
end
end
另外,假设我有a = A.new('b', 8)
。我可以调用我定义的方法:
a.b # => 'b'
a.c # => 8
A.alphabet # => 'abcdefghijklmnopqrstuvwxyz'
这样做是因为b
和c
是实例方法,这意味着它们是在实例变量上调用的。 a
是类A
的一个实例。但是,alphabet
是一个类方法(由于它位于class << self
类中),因此在类本身上调用。这应该解释实例方法与类方法
第二个问题:如何为电话簿类编写find
方法。因此,电话簿有一个属性contactList
,该数组中的所有元素都应该是Phonecontact
类型,因此要按名称从contactList
查找某个人,我们可以这样做
def find(name)
@contactList.select {|i| i.name == name}
end
这将返回指定名称的人数组。如果你想要那个阵列是他们的电话号码你可以做这样的事情。 (假设pb
是Phonebook
,其中包含联系人列表)
pb.find('james').map(&:phone_number)
此外,我建议您使用add
方法存储PhoneContacts
,这样它就可以像这样简单
def add(contact)
@contactList << contact
end