【问题标题】:Confusion accessing array values vs array position混淆访问数组值与数组位置
【发布时间】:2020-07-06 20:14:49
【问题描述】:

假设我们有以下代码:

def run(input)
  start = 0
  lap = 0

  while true
    opcode = input[start]
    input1 = input[start + 1]
    input2 = input[start + 2]
    output = input[start + 3]

    if opcode == 1
      input[output] = input[input1] + input[input2]
    elsif opcode == 2
      input[output] = input[input1] * input[input2]
    elsif opcode == 99
      puts "breaking"
      break
    else
      puts "CANT RECOGNIZE THAT OPCODE"
    end
    start += 4
    lap += 1
  end
  puts input
  puts "finished after #{lap} loops"
end

input = [1,9,10,3,2,3,11,0,99,30,40,50]
run(input)

我明白为什么打印 input1 我得到了存储在数组 (9) 中那个位置的数字,但我不明白为什么打印 input[input1] (input[input[start + 1]]) 会访问那个位置的数字值 ( 9) 指向 (30)。

代码适用于练习,但我不明白为什么。

【问题讨论】:

  • 提示:了解case,它可以帮助您的代码更容易理解和更高效。
  • 还可以考虑使用 input.each_slice(4) do |opcode, input1, input2, output| 循环以分成 4 块。
  • 谢谢。我实际上保存了您昨天的回复,但我让它以这样的原始方式工作,并考虑稍后对其进行重构。不过我还是不明白。
  • 几乎 Ruby 中的所有内容都是解析为某个值的表达式。 input[9] == 30,所以任何解析9的索引也将返回30,因为这是作为第九个元素存储在输入数组中的值。

标签: arrays ruby


【解决方案1】:

每次调用Array#[] 时,您都在进行查找,如果您将它们嵌套,那么您将获得一个指向另一个值的基于索引的“指针”。这在某些数据结构中很常见,因为它可以存储在多个地方使用的值的一个副本,等等。一个常用的例子是 DNS,根据RFC1035

在您的示例中,当您考虑 order of operations 时会更容易理解。与许多语言一样,Ruby 是由内而外进行评估的,换句话说:

a = [ 1, 2, 3 ]

a[a[1]]
# => 3

在哪里进行评估,就好像它被表达为:

x = a[1]
# => 2
a[x]
# => 3

您可以像这样嵌套索引分辨率的次数没有限制只要没有任何索引超出数组边界,因为a[1234] 返回nil,而a[nil] 是一个错误。理论上你可以无限期地这样做,但实际上你很少会这样做超过几次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 2017-09-20
    • 2017-07-22
    • 2017-11-03
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多