在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
写这篇文章的初衷源于我的伙伴们在上手Ruby过程中,表现实在是太让人拙计了。由于项目的急功近利,需要迅速入门Ruby并上手项目。所以很多开发者在实际开发过程中,不熟悉Ruby的表达方式,也会沿用其他语言比较生涩的表达形式。在我看来,Ruby的学习应该是个系统的循序渐进的过程,尽量避免急迫的方式。不过现实往往是紧迫的,所以就有了这篇文章。 标题中的菜鸟主要是指那些有其他编程语言开发经验,但在Ruby面前是个学习时间不久的初学者。我的工作伙伴都是这样的一些人。所以,我就在考虑Ruby和其他语言的一些显著的不同点,想要提点他们注意这些地方,能将程序尽量写得Rubic。在我与其他语言进行比较的过程中,有了一些灵感,所以我就写了点。后来灵感多了些,我也就多写了些。 着重指出一点,没有菜鸟开发者,只有停滞不前的开发者。系统学习一门语言才能自如地运用该语言的表达。Ruby的官方文档是永远是学习Ruby语言的最好资料,它最全面且持续更新。此外,Ruby的官方也给出了从其它语言到 Ruby的比较文档。 在Java中,字符串只有双引号的形式;在Python和JavaScript中,字符串既有单引号形式也有双引号形式,但它们实践是一回事。在Ruby的世界中,字符串的表达方式要丰富得多。Ruby中的字符串,既有单引号的形式,也有双引号的形式,但它们的含义却是截然不同的。 单引号的字符串,指的是原生字符串,其中不含有转义规则。例如 双引号的字符串,是包含转义规则的。例如
TODO 多行字符串 符号Ruby引入符号的概念,是源于Ruby的一个设计缺陷。在大部分语言设计中,字符串都设计为不可变对象;然而在Ruby当中,字符串被设计为可变的。为此,引入了另一个字符序列的类型,但它是不可变的。这就是符号(Symbol)。 Ruby中符号的写法是在文本前面加上冒号(:)。对于Ruby中合法的变量名,直接加上冒号即可,例如:
也可以在字符串前面加上冒号,这时符号的内容可以包含空格等变量名不允许的字符。示例:
这里字符串的单引号和双引号的性质也被沿用了下来。 符号是不可变的;并且,其是唯一的。对于内容完全相同的符号,其只会有一个实例存在于Ruby解释器环境中。 TODO 相同内容符号的object_id一致 符号对于Hash的构造有特殊的作用。Ruby中,Hash的构造比较繁琐,要用到
但是如果键值都是符号的话,有简便的构造方法:
它等价于:
由于在方法调用中最后一个Hash参数可以省略大括号,所以下面的调用
可以去掉大括号,写成:
这就很像Python的关键字参数了。 最后,符号和字符串的相互转化方式如下:
方法名是符号。 一切皆是对象Java中有些基本数据类型(boolean、int、double),它们不是对象。JavaScript中的基本数据类型可以理解为对象,如boolean、number、string、function;但它们不能像普通的JS对象那样自如地增删属性。Python要彻底些,一切皆是对象,包括数字和布尔值都是普通的对象。 不过,比起所有其他的语言,Ruby是贯彻一切皆是对象这一思想最彻底的语言。在Ruby中:
一切皆是表达式这可能是Ruby又一个玄妙的地方了,影射了Ruby大一统的设计理念。Ruby中一切皆是表达式,一切表达方式都返回值。
TODO 一切皆是表达式示例 一切皆是方法调用Ruby是也是贯彻面向对象设计模式最彻底的语言。在面向对象的设计理念中,为了提升封装性,会禁止直接的对象属性操作,只给出相应的get和set方法。 而在Ruby中,从语言层级中就禁止了直接访问对象属性的途径,只存在方法调用。我们平常常见的
等价于
而
的形式,实际上是
的简写。 TODO attr_reader, attr_writer, attr_accessor宏 省略分号TODO 省略分号 省略括号的方法调用Ruby中的方法调用,可以省略括号:
等价于:
控制结构TODO 控制结构:if-else,unless-else,when-case,while,begin-rescue-ensure 变量命名约定面向对象语言中,根据作用域的不同,分别有全局变量、常量、类变量、实例变量、局部变量的区别。在其他的语言中,可能是通过不同的修饰符和作用域进行区别。例如在Java中,没有全局变量的概念,常量用final修饰,类变量用static修饰,实例变量存在于类定义中,局部变量存在于方法定义中。有时候,这些变量很容易混淆;局部变量也很容易覆盖掉实例变量和类变量。 在Ruby中,是以变量名的格式区别变量的类型。总结如下:
TODO 变量名示例 方法名约定Ruby中的方法名结尾可以跟?和!。一般来说,以?结尾的方法返回布尔值;以!结尾的方法提示危险性。例如字符串中,
块Ruby中的方法不是一等公民。方法不是值,不能作为参数传递给另一个方法。不过Ruby有块的概念,块可以作为语言特性附加给方法调用。 块的写法有两种形式,分别是大括号形式和do...end形式。 大括号形式:
do...end形式:
乍一看,大括号的形式有点丑。一般来说,只在单行块的时候用大括号的形式:
Ruby中的每个方法都可以接受一个块。块要紧接着方法调用的后面,不是方法的参数之一。例如
上面的示例中省略括号也是合法的:
但像下面这样把块用括号括起来作为最后一个参数就是错误的:
块与方法一个很大的区别是块支持闭包:
TODO 在方法定义中用yield关键字调用块 迭代器Ruby中没有提供Java和JavaScript当中三段for循环的模式。所谓三段for循环,是指下面JavaScript的for循环:
Ruby中没有提供这样的方式。但这并没有什么痛苦的,因为Ruby提供了基于块的迭代方式。例如上面的代码,在Ruby中可以写成:
Ruby中的集合,都支持这样传递代码块的迭代方式。Ruby中的集合包括Range、Array、Hash、String、etc。例如上面的示例可以改写成Range的each迭代形式:
TODO -ect方法:collect, inject, select 真假值Ruby中用于if、unless、while的条件判断中,真假值的规则很简洁:
TODO list我懒! |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论