昨天写个跟 socket 有关的东西。网上先找了一些代码看了看,发现里面一些方法在官方文档里根本没有,比如 Socket.new(:INET, :STREAM) Socket.sockaddr_in(a, b)
这两个,官网上根本搜不到啊。还有个打印系统时间的,time.now.ctime 这个 ctime 到底是什么啊,理解好理解,但它们从哪里出来的到底,查不到户口,这怎么继续学习下去啊 囧!
#8 楼 @yakczh 不是。 简单说,所有 ruby 程序里面的变量,常量,符号等,都会在虚拟机里面被一个叫做 VALUE 的类型所表示,大多数情况下,普通的对象所对应的 VALUE 就是简单的 Void*,但是并不是所有的 VALUE 都是 Void*,比如 Symbol,在 ruby 内部就是一个 unsigned long(ID)。 那么 Symbol 倒地是什么,其实就是一个唯一的不变的量,用在 ruby vm 内部,用 hash 存储,key 就是刚才说的 ID,在 vm 内部他们类型都是 VALUE。 另外 vm 怎么区别一个 VALUE 倒地是 symbol 还是其他常规 Object 呢?ruby 内部是这样做的: 先把一个 VALUE 的值左移 8 个 bit,然后在右端空出来的一个 byte 里面,填充 0x0e,然后这个新造出来的值,因为不能被 4 整除,所以 ruby 就知道它不是一个 void*类型的普通 VALUE 从而判断出它是个 symbol。(ruby 分配内存都是以 4 个 byte 为一个单位来分配)
#21 楼 @goinaction Value 本身只不过是个 4byte 的值,所以可能会出现不适 4 的倍数的情况,这些情况只有这几种可能: 小整形,符号,true,false,nil,undef。