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

1

は、次の||=省略形です。

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

ステートメントが初めて実行されるときは@_tree_leftnil になるため、右側の式の値が割り当てられます。@_tree_left2 回目に実行された場合、何らかの値が残っている限り、変更されません。

単純化すると少し見やすくなります。

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

式の残りの部分は、特定のバイナリ文字列の保存と取得です。

JavaScript で簡単に複製できます。配列内の 2 つの値をすべて組み合わせているだけです。だからそれは計算しています:

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