【问题标题】:ruby - can't concatenate array elements into a string?ruby - 不能将数组元素连接成字符串?
【发布时间】:2013-06-16 23:03:22
【问题描述】:

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

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

【问题讨论】:

  • 不要只给出一个冗长的程序,尤其是当它不起作用时。告诉你你在做什么。
  • 在顶部添加了更多信息 :)
  • 本来我打算只给出有问题的部分,但当我这样做时,通常会被告知请展示整个程序:)

标签: ruby arrays string eval


【解决方案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 命令,它会激发您使数字甚至更大。这将允许您开始添加曲线和其他设计风格。

【讨论】:

  • +1 既是对我确切问题的回答,也是对改进的建议。好的。我希望我可以投票两次。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2014-11-04
  • 1970-01-01
  • 2017-11-27
  • 2021-10-05
  • 2019-03-09
  • 2023-04-02
相关资源
最近更新 更多