Ruby与Python语法混淆

3 投票
3 回答
1070 浏览
提问于 2025-04-16 04:22

我正在把一个人的Ruby代码转换成我的Python代码。原来的开发者已经不在了,我对Ruby也不太了解。他的代码大部分都比较容易理解,但有些语法让我感到困惑。

举个例子:

                myTable = ''
                myTable << [ 0, 1, 0, 0, 0, 300].pack('vvvvvv')
                myTable [40, 4] = [41310005 - 5].pack('V')

1) 我可以理解为在第二行之后,myTable会包含一个有6个值的数组,这些值是在方括号[]里指定的吗?还有,.pack()这个方法是不是和Python里的struct.pack类似?

2) 在第三行之后,右边的值会存储在数组的第40个位置,并且长度是4个字节吗?方括号里的-5是他开玩笑,还是说这个数字有什么特别的意义?

3 个回答

1

不,myTable是一个字符串(它被赋值为一个字符串字面量)。在字符串(和数组)上使用的<<操作符是追加操作符,所以你是在把一个字符串加到另一个字符串上。pack方法返回的是一个字符串,在这个例子中是“短整型,小端字节顺序”的字符串。它会是一个包含6个短整型数字的字符串,这些数字没有被转换成ASCII,只是直接放进了字符串里。

然后,这个字符串中的一部分整数以它们的原始格式被另一个来自pack的值替换,这次返回的是“长整型,小端字节顺序”。这个值被放在字符串中距离开头40个字节的位置,长度为4个字节。

这段代码有点复杂。只要知道myTable是一个字符串,而pack返回的是以原始格式表示的数字就可以了。

2

看看这个关于 Array#pack 的文档。这个方法可以把一个数组转换成二进制序列的字符串表示。这里的 v 是指“短整型,使用小端字节顺序”,而 V 是指“长整型,使用小端字节顺序”。

当你把 << 用在一个 String 对象上时,它的作用是连接字符串。不过在那之前,字符串是空的,所以其实 myTable 可以直接初始化为 [0, 1, 0, 0, 0, 300].pack('vvvvvv')

String#[m,n]= 这个方法可以用来替换从索引 mm+n 的子字符串。

3

你对第二行的理解有点错误,不过奇怪的是,你说它和 struct.pack 类似,这点倒是对的。myTable 是一个字符串。Array#pack() 会返回一个打包后的数据字符串(和 struct.pack 很像),而 String#<< 则是把一个字符串添加到接收的字符串后面。第三行的意思是把索引为 40 的位置设置为 4 个字节,内容是 [41310000].pack('V') 的结果。

撰写回答