1) ruby中包括基础的运算符,都是作为方法存在的,只是因为ruby中函数在调用的时候可以不用带()括号,所以 a = b像是其它语言中的赋值,其实可以他等同于 a.=(b),其实是调用a的=方法。同样的,==,=~等全都是方法,而不是运算符,我们可以重写它们。这种特性被称为ruby的语法糖衣。正是因为ruby提供了如此底层的操作权限,所以它非常适合用来做元编程。
2) ruby对象拥有哪些方法,可以通过调用对象的.methods方法,methods方法会返回对象的所有方法名组成的数组。想想js中只能通过for in才能获得对象的所有属性和方法——但不包括内置类提供的方法,这些方法没有办法获取到。ruby对语言的底层提供这么多友好的接口,难怪很多工程师喜欢它。
3) respond_to?方法。respond_to?方法存在于所有的对象中,对于任意消息,可以询问任何对象,是否它可以响应该消息。respond_to?常常与if逻辑一起出现。
===============================
obj = Object.new
if obj.respond_to?("talk")
obj.talk
else
puts "sorry, the object doesn't understand the 'talk' message."
end
===============================
如果用js来写,它其实类似于:
===============================
var obj = {};
if(obj.talk){
obj.talk();
} else {
alert("sorry, the object doesn't understand the 'talk' message.");
}
===============================
和js不同的是,ruby中方法的调用不需要(),所以也没办法对方法是否存在骑过obj.method进行判断(那会让它直接执行,而执行会报错,因为不存在该方法)。所以需要respond_to?方法。
4) send方法和_send_方法。 在js中,调用方法有两种方式,obj.method和obj["method"],如果方法名不确定,我们可以使用obj[""]来调用它,这种方式中method可以是一个字符串。在ruby中,没有obj[""]这种用法,如果类似的功能,需要使用send方法,或__send__方法。send和__send__功能是一样的,只是后者不容易和应用程序产生冲突,所以建议使用后者。
================================
obj.talk
obj.send("talk")
obj.__send__("talk")
================================
5) 函数的传参。在ruby中传参可以使用*x的形式,接收这个参数以后的所有参数,以函数内,x为一个数组。
================================
def m(a,b,c) m(1,2,3) a=1,b=2,c=3
def m(*a) m(1,2,3) a=[1,2,3]
def m(a=1) m a=1
m(2) a=2
def m(a,*b) m(1) a=1,b=[]
================================
6) ruby中定义变量不需要声明,没有int a / var a / $a之类的声明,而且ruby中调用方法也不需要(),所以ruby中一些习惯会让人觉得有些难以适从。 ruby中有一个裸词的概念,它们必须以小写字母或下划线开头,并且完全由数字、字母和下划线组成。
ruby中变量、方法、关键字全是裸词,当ruby碰到裸词时,根据下面规则对它进行判定:
<1> 如果裸词右边有一个等号,那么它是一个在被赋值的局部变量
<2> 如果裸词是一个关键字,那么就将它看作是关键字。(ruby内部有一关键字列表)
<3> 否则,裸词被判定为一个方法调用。
<4> 如果未定义此方法,那么会产生一条错误消息,消息的大意是:ruby不知道此裸词是什么意思。
7) 常量。ruby中常量是通过首字母大写加以辨别的。但ruby中常量并像他们名字暗示的那样是不变的,在ruby中常量其实是可以重新赋值的,只是这时会报一个警告。我们应该避免给常量重新赋值,记住,ruby的常量并不是那么安全的。
8) ruby可以定义以“=”为结尾的方法,并且可以不带括号地调用,所以在语法上它看起来就像是普通的赋值语句。利用这一点,我们可以重新定义=方法,但是可以在赋值之余,进行一些别的操作——例如判断、加工,我们管这些方法叫做“过滤”。在js之类的语言中,是没有办法重写带等号的方法的,所以在YUI3中,增加了Attribute类,它的作用是通过set和get方法来访问属性,可以在方法内部增加过滤功能。这两种方式在本质上,思路是一样的,但语言底层提供的灵活性决定了他们能否更“元”一点。