这个数组定义究竟做了什么?

时间:2013-04-04 16:32:05

标签: javascript ruby

下面是我在JavaScript中重写的一段Ruby代码。据我所知,它将数组打包为'8位无符号(unsigned char)',然后将其解压缩为'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*')

2 个答案:

答案 0 :(得分:2)

||=是一个经典的红宝石成语,意思是:

v = v || second_expression

如果第一个表达式的计算结果为falsenil,则意味着第二个表达式将被执行。

答案 1 :(得分: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)
. . .