下面是我在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*')
答案 0 :(得分:2)
||=
是一个经典的红宝石成语,意思是:
v = v || second_expression
如果第一个表达式的计算结果为false
或nil
,则意味着第二个表达式将被执行。
答案 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)
. . .