在学校里,老师们只会教C、C++、Java,我们也把它们视为“正统”,好像程序就该是那样的,函数必须按顺序传参数,文字量只能直接使用,缩进是为了好看,对象是封装+继承+多态,方法就是方法属性就是属性……在我们把它们视作理所当然时,还有很多语言有着很精彩的“另类”思想。
最近在学Python和Ruby,里面有很多思想很有意思,拿出来记录下,图个好玩。
这大概是Python里最好玩的地方了。在Python里,代码块不被任何包围符号(如C++里的{}、Pascal里的begin和end)标识。相邻的两句被视作在同一代码块中,当且仅当它们有相同的缩进。一个典型的例子如下:
很另类不是么?很多程序语言的初学者不喜欢缩进,应该让他们学学Python,因为不缩进就没法写程序。不过话说回来,其实缩进也可以乱来的,因为Python没规定子块的缩进必须比父块深。
这个不只是Python,Ruby也是如此,Javascript也是这样。我们一直被教育:”Java是纯面向对象的语言“,但是和Python与Ruby一比那就差远了。Java永远不可能写出这样的代码:
我们调用了一个字符串常量的方法join,这没什么可奇怪的。在Java里,只有从类中实例化出来的东西才是对象,你不必指望它的基本类型变量能调用什么方法(这点上C#不一样,C#的基本类型也是一个类) ,更不用指望文字常量能当作一个对象来用了。而在Python和Ruby里,没有什么不是对象的,一个数字、一串字符、一个函数、一个方法、一个类、一个模块……只要是你遇到的标识符,都可以拿来当对象用。
“标识符由字母、下划线和数字组成,其中数字不能放在标识符开头。”在C、C++等语言中,除了下划线,就不能有其他标点了。而在Ruby中可不是这样。Ruby的各种类的方法大量包含了两种标点:?和!。一般来说,返回值为True或者False的方法往往以“?”结尾,如empty?。而会修改到对象自身的方法,往往会提供带“!”和不带"!"的版本,带“!”的版本一般是会修改对象本身,然后返回对象自己;而不带“!”的方法则通常会创建一个与自身一样的新对象,在新对象上修改并返回。一般来说,修改原对象导致错误的可能性比较大,所以才会带着个“!”来提醒使用者吧。
(未完,勿待续)
Sep 19, 2008 05:30:32 AM
一般来说,返回值为True或者False的方法往往以“?”结尾,如empty?。
===============这应该是来自于scheme的习惯。。
Sep 19, 2008 05:50:44 AM
aha?
Everything is an object and a reference, except variables in python!
Sep 21, 2008 08:26:10 AM
一般来说,返回值为True或者False的方法往往以“?”结尾,如empty?。
===============这应该是来自于scheme的习惯。。
对Lisp系的了解很少,不过似乎其思想也很有意思,程序也是一种数据
Sep 21, 2008 08:27:00 AM
aha?
Everything is an object and a reference, except variables in python!
It seems that variables in python are objects too?