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/archive/2010/02/05/4426881.html

ruby学习笔记(7)相关推荐

  1. Ruby学习笔记_索引贴

    学习Ruby也有段时间了,在学习的同时也做了些笔记并发到了园子睐.看到园子里的大虾们在出了一系列文章后都会做个索引贴,这样很方便,所以本人今天抽了个空就把它整理了下,方便自己的同时也方便感兴趣的朋友. ...

  2. ruby学习笔记(11)--symbol与hash参数

    symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001&qu ...

  3. ruby学习笔记(2)-chomp,chop的区别

    还没开始系统性的学习Ruby,最近在看metasploit框架的exploit会涉及到Ruby脚本,也就硬着头皮一遍查阅资料一遍做些笔记吧. Ruby字符串中存在chop和chomp的内置函数.我在h ...

  4. Programming Ruby学习笔记一

    最近在学习Programming Ruby,做点读书笔记来记录下自己的成长也是不错的.当然更希望的是各位大牛能指出本人的不足,在这里先谢谢大家了. 第一章     入门 讲的是如何安装Ruby,在Ru ...

  5. Ruby 学习笔记(和 Python3 语法进行对比)

    我是先接触 Python3 的,如果我自己主动来选择,可能不会再去学 Ruby(可能先入为主的思想太根深蒂固了,不过最主要的还是太懒了),然鹅由于种种原因,我还是要来看一下Ruby(真是天理难容,/大 ...

  6. Ruby学习笔记:一、数据类型

    2019独角兽企业重金招聘Python工程师标准>>> 今天老大问大家,谁有兴趣学习下Ruby,部门马上要有一个使用Ruby的项目.入职两个月,几乎每天都是做一些SQL优化或是JS优 ...

  7. Ruby 学习笔记3

    在Ruby中有很多方法是以?和!号结尾的 "?"被用于标示谓词,即返回Boolean直的方法,如Array.empty?(判断数组中元素是否为空) "!"出现在 ...

  8. 【ruby】ruby学习笔记之--环境搭建

    1.安装ruby环境 这里以windows为例,ruby可以安装在Linux中,首先.先到ruby的官网下载https://rubyinstaller.org/downloads/最新的ruby环境, ...

  9. Ruby学习笔记-循环与选择结构

     一.循环结构 1.    for-in语句: Ruby提供的for...in语句主要用于迭代数组和Hash对象中的元素,与其它语言的for 语句有一定的差距,语法格式: for val  in  ...

  10. ruby学习笔记(3)--语法层面的先见之明

    看了几天ruby,发现c#中很多一直被称道的语法特性,ruby早在几年前就有了: 1.c#中的params关键字 class Program{static void Main(string[] arg ...

最新文章

  1. 【开发环境】安装 Visual Studio Community 2013 开发环境 ( 下载 Visual Studio Community 2013 with Update 5 版本的安装包 )
  2. 利用IPFS构建自己的去中心化分布式Wiki系统
  3. 洛谷P3810 【模板】三维偏序(陌上花开) CDQ分治初探
  4. OpenCV Laplace point/edge detection拉普拉斯点/边缘检测的实例(附完整代码)
  5. 模版方法模式在Spring框架中的应用
  6. QQ 调查用户是否希望推 「已读」功能,如何评价「已读」功能?QQ是否要加这个功能?...
  7. 最新js实现复制粘贴功能实例
  8. 用js实现改变随意改变div属性style的名称和值的结果
  9. Java与Web前端发展前景及薪资对比
  10. 时钟模块ds1302的使用
  11. knockout的监控数组实现 - 司徒正美
  12. 送给计算机老师平安夜贺卡,给老师的平安夜祝福语
  13. easyUI设置表格中的背景色
  14. SAP销售开票同一客户实现不同统驭科目配置
  15. 什么是跨域?如何解决跨域?
  16. keystore生成签名证书
  17. HTML网页黑白滤镜
  18. 论文阅读九:yolov4的各种数据增广技术random erasing、cutout、mixup、cutmix、mosaic等
  19. python数字分割
  20. /etc/sysconfig/network 文件

热门文章

  1. 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_3、快速创建SpringBoot应用之手工创建web应用...
  2. npm安装vue-cli时速度慢,fetchMetadata经常卡住并报异常
  3. nexus配置第三方库文件
  4. [bzoj1066] [SCOI2007]蜥蜴
  5. python解决一些错误换行问题
  6. weblogic domain的安装与配置
  7. win8蓝屏错误代码DPC_WATCHDOG_VIOLATION您的电脑遇到错误需要重启修复
  8. WordPress W3 Super Cache插件远程PHP代码执行漏洞
  9. 使用maven搭建ssm项目配置+tomact
  10. Elasticsearch 系列4 --- Windows10安装Kibana