我试图在命令行中创建一个目录。数组中的每个元素都是一个字符串变量。
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]
没有。据我所知,他们是一样的,不是吗?
答案 0 :(得分:1)
在处理类似数组和哈希的Enumerable
时,搜索文档以查看是否存在可以使代码更高级别和更具表现力的内容非常有用。在这种情况下,您可以使用each_cons
为您提供配对,这样您根本不需要使用数组索引:
2.3.0 :004 > [1,2,3,4].each_cons(2).to_a
=> [[1, 2], [2, 3], [3, 4]]
此外,使用if
和select
的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
并返回该值。