如何在Ruby

时间:2016-11-02 19:50:42

标签: ruby

我有这个电话簿程序,它带有一个电话号码和电话号码类型(可以是你的家庭电话,手机等),这被称为标签。该程序可以获取这些值并将其存储在地址簿中,以便添加联系人,删除联系人和查找联系人。

有一个名为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

1 个答案:

答案 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'

这样做是因为bc是实例方法,这意味着它们是在实例变量上调用的。 a是类A的一个实例。但是,alphabet是一个类方法(由于它位于class << self类中),因此在类本身上调用。这应该解释实例方法与类方法

第二个问题:如何为电话簿类编写find方法。因此,电话簿有一个属性contactList,该数组中的所有元素都应该是Phonecontact类型,因此要按名称从contactList查找某个人,我们可以这样做

def find(name)
  @contactList.select {|i| i.name == name}
end

这将返回指定名称的人数组。如果你想要那个阵列是他们的电话号码你可以做这样的事情。 (假设pbPhonebook,其中包含联系人列表)

pb.find('james').map(&:phone_number)

此外,我建议您使用add方法存储PhoneContacts,这样它就可以像这样简单

def add(contact)
  @contactList << contact
end