0

下面是一段我用 JavaScript 重写的 Ruby 代码。我知道它将数组打包为“8 位无符号(无符号字符)”,然后将其解包为“16 位无符号,VAX(小端)字节顺序”,但我尝试让它在 JavaScript 中工作有失败的。

我想知道是否||=对数组中的值有任何影响?

我还想知道打包和拆包如何影响数组中的值?它只会0x01变成0x0100?

@_tree_left ||= [
  0x01, 0x01, 0x03, 0x01, 0x05, 0x01, 0x07, 0x01, 0x0B, 0x01, 0x0D, 0x01,
  0xF9, 0x00, 0xFB, 0x00, 0xFD, 0x00, 0x00, 0x01
].pack('C*').unpack('v*')
4

2 回答 2

2

||=是一个经典的Ruby成语意思:

v = v || second_expression

如果第一个表达式的计算结果为,false或者nil这意味着将执行第二个表达式。

于 2013-04-04T16:42:42.193 回答
1

||=只是以下的简写:

@_tree_left = @_tree_left || [ ... ].pack('C*').unpack('v*')

第一次执行语句时,@_tree_left将为 nil,因此将为其分配右侧表达式的值。如果第二次执行,那么只要@_tree_left还剩下任何一种值,它就不会被改变。

看是否简化会更容易一些。

@a             # => nil
@a = @a || 123 # => 123
@a = @a || 456 # => 123, no change this time

表达式的其余部分是存储和检索特定的二进制字符串。

它可以很容易地在 JavaScript 中复制。它只是组合数组中的每两个值。所以它是计算:

b[0] = a[0] + (a[1] << 8)
b[1] = a[2] + (a[3] << 8)
. . .
于 2013-04-04T16:38:59.240 回答