Ruby中的数组元素访问

时间:2016-04-14 04:07:30

标签: ruby variable-assignment

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

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]没有。据我所知,他们是一样的,不是吗?

2 个答案:

答案 0 :(得分:1)

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

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

此外,使用ifselect的IMO最好不是使用reject语句。

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

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

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

答案 1 :(得分:0)

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