Ruby中的数组元素访问



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

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]无效。据我所知,它们是一样的,不是吗?

在处理像数组和哈希这样的Enumerable时,搜索文档以查看是否有可以使代码更高级别和更具表达性的内容是很有用的。在这种情况下,您可以使用each_cons为您提供对,这样您就根本不需要使用数组索引:

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

此外,与其使用if语句,不如使用selectreject

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

使用这些想法,您的代码可能看起来像这样:

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

x + 1返回该值并且没有副作用(不会更改x的引用)。CCD_ 11重新分配CCD_ 12并返回该值。

最新更新