2013-06-16 4 views
2

Для личной домашней работы я пробую программу цифровых часов, чтобы отображать «большие» цифры.ruby ​​- невозможно объединить элементы массива в строку?

Рубиновая программа, которая имеет части часов, которые поступают из строк, хранящихся в массиве, а затем подпрограмму (еще не полностью написанную), которая может отображать любые числа в виде «больших чисел».
Это поможет мне узнать больше о манипулировании хэши и переборе массивов, конкатенации строки и т.д.

Я застрял прямо сейчас с этим:

all_nums='' 
(0..3).each do |num| 
    all_nums+= (line_parts[num][0].values).to_s 
    #puts line_parts[num][0].values 
end 
puts all_nums 

, потому что я получаю обратно элементы массива, которые я не может преобразовать в строки, т.е.

ruby digital_clock,rb 
[" == "]["| | "]["| | "][" == "] 

, но когда я просто puts их (закомментирована 3-й линии от дна) это нормально, но я получаю строки, т.е.

ruby digital_clock.rb 
== 
| | 
| | 
== 

Я хочу, чтобы иметь возможность построить строку (в этом случае большое число 0), но я могу только выставлять куски, и я не смог назначить их переменной и напечатать ее. Как я мог это сделать?

Полная программа:

top=   ' ==  | == == | | == |  == == == ' 
top_middle= '| |  | __| __| |__| |__ |__  | |__| |__|' 
bottom_middle='| |  | |  |  |  | | |  | | |  |' 
bottom=  ' ==  | == ==  | == ==  | ==  |' 

number_parts=[{},{},{},{},{},{},{},{},{},{}] 
line_parts=[[],[],[],[]] 

['top','top_middle','bottom_middle','bottom'].each_with_index do |one_line, i| 
    number_parts=[{},{},{},{},{},{},{},{},{},{}] 
    (0..9).each do |the_num| 
    number_parts[the_num] = {one_line.to_sym => eval(one_line)[the_num*5,5].to_s} 
    end 
    line_parts[i]= number_parts 
end 

all_nums='' 
(0..3).each do |num| 
    all_nums+= (line_parts[num][0].values).to_s 
    #puts line_parts[num][0].values 
end 
puts all_nums 
+0

Не просто дайте подробную программу, особенно если она не работает. Расскажите, что вы делаете. – sawa

+0

Добавлен больше информации наверху :) – junky

+0

Первоначально я собирался просто дать детали, о которых идет речь, но когда я это делаю, мне обычно говорят, чтобы показать всю программу :) – junky

ответ

1

Я думаю, что это будет исправить вашу непосредственную проблему - а именно, печать большой «0».

all_nums = [] 
(0..3).each do |num| 
    all_nums.push(line_parts[num][0].values) 
end 
puts all_nums.join("\n") 

Лучший способ сделать это было бы с map:

all_nums = (0..3).map { |num| line_parts[num][0].values } 
puts all_nums.join("\n") 

Другой вопрос: вам не нужно использовать eval. Фактически, почти никогда не нужно использовать eval.

# Use variables rather than the strings 'top', 'top_middle', etc. 
[top,top_middle,bottom_middle,bottom].each_with_index do |one_line, i| 
    ... 
    # Then the eval() is unnecessary. 
    number_parts[the_num] = {one_line.to_sym => one_line[the_num*5,5]} 
    .... 

Но вы можете реально упростить код по следующим направлениям:

# Use an array, not a set of specifically named variables. 
# This makes it a lot easier to iterate over the data. 
rows = [ 
    ' --  | -- -- | | -- |  -- -- -- ', 
    ' | | | __| __| |__| |__ |__  | |__| |__|', 
    ' | | | |  | | | | | | | | |', 
    ' --  | -- --  | -- --  | --  |', 
] 

# Create an array-of-arrays. 
# num_parts[NUMBER] = [an array of four strings] 
width = 5 
num_parts = (0..9).map { |n| rows.map { |r| r[n * width, width] } } 

# Inspect. 
num_parts.each do |np| 
    puts 
    puts np.join("\n") 
end 

Вы также можете взглянуть на команду Unix под названием banner, которая будет вдохновлять вас, чтобы сделать номера еще больше. Это позволит вам начать добавлять кривые и другие элементы дизайна.

+0

+1 И ответ на мою точную проблему, плюс предложения по улучшению. хороший. Жаль, что я не смог бы удвоить. благодаря! – junky

Смежные вопросы