ruby学习笔记(7)

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方法来访问属性,可以在方法内部增加过滤功能。这两种方式在本质上,思路是一样的,但语言底层提供的灵活性决定了他们能否更“元”一点。

原文地址:https://www.cnblogs.com/cly84920/p/4426880.html