Tag Archives: Ruby

从ruby的面向对象说起

ruby是一个完全面向对象的语言。在许多其他语言里不是对象的东西在ruby里也都是对象,比如整数。更神奇的是,类也是对象。为什么说神奇呢?看一下下面的代码:

class A
end
puts A.class

结果是Class。可以看到,类A 也是一个对象,它是类Class的实例。接着看

puts Class.class

原来Class是Class类自己的实例。

puts Class.superclass
puts Module.superclass
puts Object.superclass
puts Object.class

类Class的爸爸是Module,Module的爸爸是Object。而Object是所有类的祖宗。但是类Object还是类Class的实例。很神奇吧。

我们知道,对象是类的实例,是由类创建的。而在ruby中,类本身也是一个对象,这就形成了一种鸡生蛋蛋生鸡的循环。似乎这是周而复始,无穷无尽的,就像下面那幅埃舍尔的名画

这两个相互描绘的手就像是ruby中的类和对象。两只手相互描绘在现实世界里是不可能的。那么在ruby中,又是如何打破这个僵局的呢?其实很简单,这两只相互描绘的手只是一幅画而已。而让两只手相互描绘则是画家。在画面内部无法解决的矛盾跳到画面外面就很简单了。在ruby里也是如此。在语言层面,类和对象似乎也像是这两只相互描绘的手,但不要忘了,还有一个ruby虚拟机的存在。一切的对象都是由它创建,而语言里的ClassName.new并没有直接创建对象。在一切的开始,虚拟机创建了Class,Module,Object,之后,这三个东西就可以滋生出整个对象世界。虚拟机就像是至高无上的神,创建了整个世界。但是在一个ruby代码的世界里,能看到的却只有对象,而不能直接看到虚拟机的存在。我们可以写完全面向对象的代码,而不用去操心这些对象究竟是怎么来的。

回到现实世界。不知道大家有没有想过我们的现实世界是怎么来的。根据被普遍接受的物质不灭理论,物质不会消失,也不会凭空出现。那么这些物质最初又是怎么来的呢?话说我们的宇宙是由一个很小的核心爆炸,不断膨胀而产生的,又话说宇宙在膨胀到极限后又会重新收缩,又变回一个很小的核心,周而复始。那么这一切又是如何开始的呢?在这个宇宙之外又是什么样呢?如果这些问题存在答案的话,要么接受一个创造这一切的“神”的存在,要么就只能说,物质是无须创造而自然存在的。

找到全部中国大陆IP段

  可怜的学校的BBS,为了不让国外流量把计费器耗完,要找到全部中国大陆的IP段。首先是要有IP地址的数据,这在APNIC的网站上可以找到。
国家IP段数据下载地址:http://ftp.apnic.net/apnic/dbase/data/country-ipv4.lst
  有了数据就好办了,写几行程序,把其中大陆的ip段抽出来即可。
file = File.open(‘country-ipv4.lst’)
file.each do|line|
next if line =~ /^#/
items = line.split(‘ ‘)
puts “#{items[0]} – #{items[2]}” if items[6] == ‘cn’
end
  顺便试试ruby。