2013-04-04 66 views
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*') 

回答

1

||=只是簡寫:

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

第一次執行該語句,@_tree_left將是零,所以它會被分配右手錶達式的值。如果第二次執行,那麼只要@_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) 
. . . 
+0

啊哈!我現在知道了 – 2013-04-04 19:20:27

2
||=

是一個經典的Ruby成語含義:

v = v || second_expression 

如果第一表達式評估爲falsenil這意味着第二個將被執行。