2016-11-02 6 views
0

나는이 전화 번호부 프로그램에 전화 번호와 전화 번호 유형 (집 전화, 휴대 전화 등일 수 있음)을 레이블로 사용합니다. 프로그램은 해당 값을 가져 와서 주소록에 저장하고 주소록을 추가하고, 연락처를 삭제하고, 연락처를 찾을 수 있습니다.Ruby의 다른 클래스에서 다른 변수를 사용하는 방법

두 개의 매개 변수 인 전화 번호와 레이블을 사용하는 PhoneContact라는 클래스가 있습니다. 이 수업의 목적은 레이블 (집 전화, 직장 전화, 휴대 전화 등)과 함께 전화 번호를 가져와 어떤 종류의 전화 번호인지, 그 번호의 지역 코드가 무엇인지 등

예는 다음과 같습니다

James_May = PhoneContact.new('(555) 555-5555', :mobile) 
puts James_May.phone_number 
>> (555) 555-555 
puts James_May.label 
>> mobile 

내가 저장, 추가, 삭제 및 전화 연락처를 찾을 수있는 전화 번호부 클래스를 만들었습니다. 이것의

예는 다음과 같습니다

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 클래스 PHONE_NUMBER 및 레이블과 같은 변수를 구현하는 방법을 잘 모르겠어요입니다. 다른 클래스의 변수를 사용하려면 어떻게해야하며 이러한 변수를 해시로 구현하는 것이 맞습니까? 여기

는 PhoneClass에서 코드의 조각입니다 :

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

것처럼 간단 할 수 있습니다 것이 좋습니다 네가 무엇을 요구하는지. A 클래스의 클래스가'b'와'c' (읽기 가능)라는 것을 가정 해 봅시다. 'a'가'A' 타입이라고합시다. 'b' 또는'c'에 액세스하고 싶다면'a.b'와'a.c'를 각각 실행할 수 있습니다. –

+0

나는 두 가지를 알아 내려고하고있다. 먼저 PhoneContact 클래스에서 phone_number 및 label을 어떻게 사용할 수 있습니까? 당신이 말했듯이, 나는 전화 번호부 전화 번호와 PhoneBook.label을 사용하여 그 변수들을 호출 할 수 있습니까? 두 번째로, add 메소드를 어떻게 작동 시키나요? add 메소드가 name, phone_number 및 label과 같은 매개 변수를 사용하도록합니다. 그래서 find (name) 메소드를 사용하면 이름이 표시됩니다. – Codes316

+0

'Phonebook'이 클래스이기 때문에'Phonebook.phone_number'를 호출 할 수 없습니다. '전화 번호부'유형의 인스턴스 변수에서 호출해야합니다. 이것을'pb = Phonebook.new','pb.phone_number' 또는'pb.label'로 할 수 있습니다. –

답변

2

좋아, 그래서 당신의 혼란은 두 가지 것 같다 : 여기

class PhoneContact 
    attr_reader :label 

    def initialize(phone_number, label) 
    @label = label 
    @phone_number = normalize(phone_number) 
    end 

전화 번호부 클래스에서 코드입니다 . 첫 번째 문제는 메소드를 호출 할 객체입니다. 여기에 설명을 해 드리겠습니다. 나는 또한이 클래스 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들이 인스턴스 변수라고 의미 인스턴스 메소드 때문는 다음과 같이 작동합니다 : 나는 다음과 같이 정의 된 메소드를 호출 할 수 있습니다. aA 클래스의 인스턴스입니다. 그러나 alphabet은 클래스 메서드 (class << self 클래스 내부에있는 것으로 분명 함)이므로 클래스 자체에서 호출됩니다. 이것은 인스턴스 메소드와 클래스 메소드를 설명해야합니다.

두 번째 문제점 : 전화 번호부 클래스에 대해 find 메소드를 작성하려면 어떻게해야합니까? 전화 번호부가 속성 contactList을 가지고 있으며, 그래서 그 배열의 모든 요소를이는 사람들의 배열을 반환합니다 그래서 우리는이

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

을 할 수있는 이름으로 contactList에서 사람을 찾기 위해, 유형 Phonecontact이어야한다 이름이 지정되었습니다. 전화 번호 배열을 원할 경우 이와 같은 작업을 수행 할 수 있습니다.또한

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

(pb 가정하면 연락처 목록과 Phonebook이다), 나는 당신의 add 방법 저장소 PhoneContacts, 그래서 정말 정말 이해가 안 돼요이

def add(contact) 
    @contactList << contact 
end 
+0

설명해 주셔서 감사합니다. 그것은 명확한 일을합니다. 이제 인스턴스 변수와 인스턴스 메소드가 무엇인지 이해합니다. 내 질문에 명확하지 않은 경우 내 문제는 매개 변수 레이블 및 phone_number PhoneNumber 클래스의 PhoneContact 클래스에서 add 메서드를 만드는 방법입니다. 만약 내가'B = PhoneBook.new'을 실행하여 전화 번호부의 새로운 인스턴스를 만들면,'B.add ('555-555-5555', : label)'가 add 메소드가 다른 클래스의 label 및 phone_number를 사용할 수없는 경우 작동합니다. – Codes316

+0

': label'은 무엇을 말하고 있을까요? 'james_may = PhoneContact.new ('(555) 555-5555', : mobile)'및'b = PhoneBook.new'이 있고'james_may'를'b'에 추가하고 싶다면'b 할 수 있어요. .add (james_may.phone_number, james_may.label)'. –

+0

레이블은 어떤 종류의 전화 번호인지를 나타냅니다. 그래서, 사람의 집 번호, 셀 번호, 직장 번호 등이 될 수 있습니다.이'b.add (james_may.phone_number, james_may.label)'을 어떻게하면 내 PhoneBook 클래스의 add 메소드가 보이게 될까요? 내가 생각하고 있었던 방식이 해시를하고 있었기 때문이야. 연락처 이름은 그 사람의 전화 번호와 같을 것입니다. – Codes316

관련 문제