Ruby 中的数组元素访问

Array element access in Ruby

我试图在命令行中创建一个 Table 目录。数组中的每个元素都是一个字符串变量。

arr = [chap1, chap1_page, chap2, chap2_page, chap3, chap3_page]
x = 0

until x == arr.length
if ((arr[x] != 0 ))
    puts arr[x].ljust(line/2) + arr[x += 1].rjust(line/2)       
end 
x += 1
end

我想知道是否有人可以解释 puts 语句的后半部分。我不确定为什么 arr[x+=1] 有效但 arr[x+1] 无效。据我所知,它们是一样的,不是吗?

x + 1 returns 该值并且没有副作用(不会更改 x 的引用)。 x += 1 重新分配 x 和 returns 该值。

在处理数组和散列等 Enumerable 时,搜索文档以查看是否有可以使您的代码更高层次和更具表现力的内容很有用。在这种情况下,您可以使用 each_cons 为您提供对,因此您根本不需要使用数组索引:

2.3.0 :004 > [1,2,3,4].each_cons(2).to_a
 => [[1, 2], [2, 3], [3, 4]]

此外,IMO 最好使用 selectreject.

,而不是使用 if 语句

此外,中间局部变量可以使您的代码更具可读性。

使用这些想法,您的代码可能如下所示:

array = [chap1, chap1_page, chap2, chap2_page, chap3, chap3_page]

width = line / 2

array.each_cons(2).reject { |x,y| x == 0 }.each do |left, right|
  puts left.ljust(width) + right.ljust(width)
end

(我没有测试过这段代码,但它显示了大致的思路。)

您可以分解那些可枚举的调用并将中间值分配给局部变量,如果这对您来说更清楚的话:

array = [chap1, chap1_page, chap2, chap2_page, chap3, chap3_page]
width = line / 2

pairs = array.each_cons(2)
nonzero_pairs = pairs.reject { |x,y| x == 0 }
nonzero_pairs.each do |left, right|
  puts left.ljust(width) + right.rjust(width)
end