Ruby与Python语法混淆
我正在把一个人的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 个回答
不,myTable是一个字符串(它被赋值为一个字符串字面量)。在字符串(和数组)上使用的<<操作符是追加操作符,所以你是在把一个字符串加到另一个字符串上。pack方法返回的是一个字符串,在这个例子中是“短整型,小端字节顺序”的字符串。它会是一个包含6个短整型数字的字符串,这些数字没有被转换成ASCII,只是直接放进了字符串里。
然后,这个字符串中的一部分整数以它们的原始格式被另一个来自pack的值替换,这次返回的是“长整型,小端字节顺序”。这个值被放在字符串中距离开头40个字节的位置,长度为4个字节。
这段代码有点复杂。只要知道myTable是一个字符串,而pack返回的是以原始格式表示的数字就可以了。
看看这个关于 Array#pack
的文档。这个方法可以把一个数组转换成二进制序列的字符串表示。这里的 v
是指“短整型,使用小端字节顺序”,而 V
是指“长整型,使用小端字节顺序”。
当你把 <<
用在一个 String
对象上时,它的作用是连接字符串。不过在那之前,字符串是空的,所以其实 myTable
可以直接初始化为 [0, 1, 0, 0, 0, 300].pack('vvvvvv')
。
String#[m,n]=
这个方法可以用来替换从索引 m
到 m+n
的子字符串。
你对第二行的理解有点错误,不过奇怪的是,你说它和 struct.pack
类似,这点倒是对的。myTable
是一个字符串。Array#pack()
会返回一个打包后的数据字符串(和 struct.pack
很像),而 String#<<
则是把一个字符串添加到接收的字符串后面。第三行的意思是把索引为 40 的位置设置为 4 个字节,内容是 [41310000].pack('V')
的结果。