【问题标题】:Array element access in RubyRuby 中的数组元素访问
【发布时间】:2016-04-14 04:07:30
【问题描述】:

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

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

【问题讨论】:

  • 旁注:这不是真正地道的 Ruby。你熟悉Array#each吗?作为副作用,您不需要像这样使用计数器变量。有关主题的更多信息:您所说的“有效”和“不[有效]”是什么意思?如果 x 是 2,那么 arr[x + 1] 应该返回索引 3 处的元素。您看到了什么出乎意料的输出?
  • 我希望输出格式为左侧章节和右侧页面,然后在下一行重复。但是使用 x+1 我看到下一行显示 chap1_page ....chap2。

标签: ruby variable-assignment


【解决方案1】:

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

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

此外,与使用 if 语句相比,IMO 最好使用 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,我知道 += 正在重新分配 x,但不明白为什么它会给我想要的输出。我现在意识到我要增加 x 两次,一次在 puts 语句中,第二次在循环结束时。这就是为什么我的输出是我想要的。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多