ruby - 无法将数组元素连接成字符串?

时间:2013-06-16 13:15:56

标签: ruby arrays string eval

对于个人作业,我正在尝试使用数字时钟程序来显示“大”数字。

一个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

1 个答案:

答案 0 :(得分: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

您可能还会看一下名为banner的Unix命令,它会激发您使数字 EVEN BIGGER 。这将允许您开始添加曲线和其他设计触摸。