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

  • 相关阅读:
    编程输出2~100之间的质数
    Java基本类型和引用类型
    内存溢出原因及解决方案
    ACE通信机制
    ACE线程管理机制并发控制
    ACE中UDP通信
    ACE线程管理机制并发控制(3)
    ACE线程管理机制线程的创建与管理
    ACE线程管理机制并发控制(1)
    ACE中TCP通信
  • 原文地址:https://www.cnblogs.com/cly84920/p/4426881.html
Copyright © 2020-2023  润新知