-1

콘솔에 2D 배열을 출력하려고합니다. 배열의 정보가이 질문 끝 부분의 원하는 출력에 표시된대로 잘 포맷되기를 바랍니다. 내가 문자열로 포맷 콘솔에 배열의 내용을 출력 할 수 있도록하려면고정 너비 열의 속성을 가진 테이블로 터미널에 객체 배열을 출력합니다.

#family_members.rb 

class FamilyMember 

attr_accessor :name, :sex, :status, :age 
def initialize (name, sex, type, role, age) 
    @name = name 
    @sex = sex 
    @type = type 
    @role = role 
    @age = age 
end 

end 

# Below, an array is created called fm; instances of the class are then instantiated within the array elements 
fm = {} 
fm[1] = FamilyMember.new('Andrew','Male', 'Child', 'Son' , '27') 
fm[2] = FamilyMember.new('Bill','Male', 'Parent', 'Father' , '63') 
fm[3] = FamilyMember.new('Samantha','Female', 'Parent', 'Mother' , '62') 
fm[4] = FamilyMember.new('Thomas','Male', 'Child', 'Dog' , '10') 
fm[5] = FamilyMember.new('Samantha', 'Female', 'Child', 'Dog' , '4') 

: (인스턴스가 FamilyMember 클래스의 생성) 다음과 같이 내 배열이 만들어집니다. 이 두 가지 방법, 즉 each을 사용하고 별도로 do을 사용하여 수행 할 수 있어야합니다.

내가 시도 무엇 (inspired by a previous SO question는) :

def eacharray(an_array) 
    an_array.each do |inner| 
     puts inner.join(" ") 
    end 
end 

eacharray(fm) 

다음 위의 출력이됩니다 그러나 같이

1 #<FamilyMember:0x000000027e7d48> 
2 #<FamilyMember:0x000000027e7c58> 
3 #<FamilyMember:0x000000027e7b68> 
4 #<FamilyMember:0x000000027e7a78> 
5 #<FamilyMember:0x000000027e7988> 

eachdo를 사용하여 2 차원 배열 요소가 잘 포맷 된 I 출력을하는 방법 ?. 어떤 도움을 주셔서 감사합니다. 감사.

이상적으로, 내 출력은 다음과 같이 될 것이다 : 당신은 고정 된 형식에 만족하는 경우

Family Member Name  Sex  Type Role Age 
1    Andrew Male Child Son  27 
2    Bill  Male Parent Father 63 
3    Samantha Female Parent Mother 62 
4    Thomas Male Child Dog  10 
5    Samantha Female Child Dog  4 
+0

예상되는 출력 .. 예를 들어이 무엇을 .. 나는이 * 나는 배열의 내용을 출력 할 수 있도록하려면하지 않았다하시기 바랍니다 콘솔은 문자열 *로 포맷됩니다. –

+2

'fn'은 배열이 아니며 해쉬입니다. – sawa

+0

@ArupRakshit - 내 질문에 선호 출력을 추가했습니다. 덕분에 – Tom

답변

7

은 당신이 뭔가를 쓸 수 있습니다 (동적으로 각 필드의 최대 데이터 폭에 따라 형식을 만들 수) 이렇게.

class FamilyMember 
    attr_accessor :name, :sex, :type, :role, :age 
    def initialize (*args) 
    @name, @sex, @type, @role, @age = args 
    end 
end 

fm = [] 
fm << FamilyMember.new('Andrew', 'Male', 'Child', 'Son' , '27') 
fm << FamilyMember.new('Bill',  'Male', 'Parent', 'Father', '63') 
fm << FamilyMember.new('Samantha', 'Female', 'Parent', 'Mother', '62') 
fm << FamilyMember.new('Thomas', 'Male', 'Child', 'Dog' , '10') 
fm << FamilyMember.new('Samantha', 'Female', 'Child', 'Dog' ,  '4') 

format = '%-15s %-8s %-7s %-7s %-7s %s' 
puts format % ['Family Member', 'Name', 'Sex', 'Type', 'Role', 'Age'] 
fm.each_with_index do |member, i| 
    puts format % [ i+1, member.name, member.sex, member.type, member.role, member.age ] 
end 

출력

Family Member Name  Sex  Type Role Age 
1    Andrew Male Child Son  27 
2    Bill  Male Parent Father 63 
3    Samantha Female Parent Mother 62 
4    Thomas Male Child Dog  10 
5    Samantha Female Child Dog  4 

또한 실제로 each 반복자를 사용하는 거의 동일한 루프를 컴파일 for ... in를 사용할 수 있습니다.

i = 0 
for member in fm do 
    i += 1 
    puts format % [ i, member.name, member.sex, member.type, member.role, member.age ] 
end 

또는 당신은 대부분의 루비 프로그래머는 잊어 원시 while 또는 until 루프 구조를 사용할 수 있습니다. 루비는 반복자를 사용하여 훨씬 표현력이 뛰어납니다. 당신이 마지막 두 예제에서 do를 생략 할 수 있습니다

i = 0 
while member = fm[i] do 
    i += 1 
    puts format % [ i, member.name, member.sex, member.type, member.role, member.age ] 
end 

. while 표현 이후에 개행 (또는 세미콜론)이있는 한 루비는 잘 이해합니다.

+0

감사합니다. Borodin; 이것은 위대한 작품. 배열 검색에서'do'를 사용하지 않고 그것을 할 수있는 방법이 있습니까? 나는 이것을하려고 시도하고있다 (대학 과제를위한 요구 사항)'% -15s' 등을 말하면 열의 너비를 지정하고 있는가? – Tom

+1

@ 제니 : 제니 무슨 뜻인지 모르겠어요. 'do' ...'end'는'each' 배열 요소에 대해 수행 할 명령문 목록을 묶는 괄호입니다. 대신에 중괄호를 사용할 수 있습니다 :'{'...'}'는 비슷합니다. 문자열의 '%'연산자는 왼쪽의 피연산자를 ['Kernel # sprintf']의 형식으로 사용합니다 (http://www.ruby-doc.org/core-2.0.0/Kernel.html#method- i-sprintf)이고 '% -15s'와 같은 형식 지정자는 왼쪽 정렬 ('-') 15 자 (15') 문자열 필드 ('s')를 의미합니다. – Borodin

+1

@Jenny : 아, 이것이 임무를위한 것이라면, 나는 이해한다고 생각합니다. 설명 할 대답을 추가했습니다. (당신은 대답을 위해 Stack Overflow를 요구할 예정입니까?) – Borodin

1

FamilyMember와 같은 클래스는 Struct로 가장 쉽게 생성됩니다. 결과는 단지 클래스이지만, 몇 가지 추가 기능이 있습니다.

FamilyMember = Struct.new(:name, :sex, :type, :status, :age) 
fm = [] 
fm << FamilyMember.new('Andrew','Male', 'Child', 'Son' , '27') 
fm << FamilyMember.new('Bill','Male', 'Parent', 'Father' , '63') 

puts FamilyMember.members.map(&:capitalize).join("\t") #members gives you the names of all methods 
fm.each{|fam_member|puts fam_member.values.join("\t")} #another feature. 

출력 :

Name Sex Type Status Age 
Andrew Male Child Son 27 
Bill Male Parent Father 63 

만 밖으로 줄을 ... 나는이 지금되지 관련이있을 수 있음을 이해

0

. 그러나 이것을 공유하면 다른 사람이 활용할 수 있습니다.

이 보석 시도 - 터미널 테이블

terminal-table