第4章 对象、变量和常量

本章会介绍Ruby操作时需要掌握的基础知识,主要有以下四部分内容。
1.对象
2.类
3.变量
4.常量

4.1 对象

在Ruby中,表现数据的基本单位为对象(object)。
对象的类型非常多,我们这里只介绍常用的对象。
·数值对象
1、-10、3.1415等是表示数字的对象,另外还有表示矩阵、复数、素数、公式的对象。
·字符串对象
“你好”、“hello”是表示文字的对象
·数组对象、散列对象
表示多个数据集合的对象
·正则表达式对象
表示匹配模式的对象
·时间对象
表示时间的对象
·文件对象
一般我们可以理解为表示文件本身的对象,但确切来说,它是对文件进行读写操作的对象。
·符号对象
表示用于识别方法等名称的标签的对象。
除此之外,Ruby还有范围对象、异常对象等。

4.2 类

Ruby的类(class)表示的就是对象的种类。
对象拥有什么特性等,这些都是由类来决定的。到目前为止,我们所介绍的对象与所属类的对应关系如下:


对象 类
数值 Numeric
字符串 String
数组 Array
散列 Hash
正则表达式 Regexp
文件 File
符号 Symbol


注意:xx类的对象,我们一般也会说成“xx类的实例(Instance)”。所有Ruby对象其实都是某个类的实例,因此在Ruby中的对象和实例的意义几乎是一样的。

4.3 变量

变量就是对象的名片。
Ruby中有四种类型的变量。

  • 局部变量(local variable)
    以英文字母或者_开头
  • 全局变量 (global variable )
    以$开头
  • 实例变量 (instance variable)
    以@开头
  • 类变量 (class variable)
    以@@开头
  • 伪变量 (pseudo variable)
    是 Ruby 预先定义好的代表某特定值的特殊变量,因此即使我们在 程序里给伪变量赋值,它的值也不会改变。Ruby 中,nil、true、false、self 等都是伪变量。它们表面上虽然看着像变量,但实际的行为又与变量有差 别,因此称为伪变量。

下面我们来说明局部变量和全局变量的不同。

代码清单 4.1 scopetest.rb

$x = 0
x = 0

require "./sub"

p $x  #=> 1
p x    #=> 0

代码清单 4.2 sub.rb

$x = 1  #对全局变量赋值
x = 1   #对局部变量赋值
截屏2021-01-25 下午2.41.44.png

程序首次给局部变量赋值对同时,局部变量就会被初始化,如果引用了未初始化的局部变量,程序就会抛出异常。

2.5.3 :001 > x + 1
Traceback (most recent call last):
        1: from (irb#1):1
NameError (undefined local variable or method `x' for main:Object)

4.4 常量

常量和变量一样,是某个对象的“名片”。不过与变量不同的是,对已经赋值的常量再进行赋值时,Ruby会作出警告。

2.5.3 :002 > RES = 1
 => 1 
2.5.3 :003 > RES = 2
(irb#1):3: warning: already initialized constant RES
(irb#1):2: warning: previous definition of RES was here
 => 2 
2.5.3 :004 > RES
 => 2 

我们注意到,虽然会作出警告,但是还是赋值成功了。
常量以大写英文字母开头,例如,Ruby 的运行版本(RUBY_VERSION)、运行平台(RUBY_PLATFORM)、命令行参数数组(ARGV)等,都是 Ruby 预定义的好 的常量。

4.5 保留字

表 4.2 中的单词,在程序中作为名称使用时会受到限制。这些受到限制的单词,我们称为保留字。在程序里,如果不小心使用了 end、next 等作为变量 名,Ruby 会提示我们语法错误。

表 4.2

4.6 多重赋值

我们已经介绍过“变量=值”这样的变量赋值方法,Ruby 还提供了一个只用一个表达式就能给多个变量赋值的简便方法——多重赋值。很多情况下我们都会用 到多重赋值,在这里举几个比较典型的例子供大家参考。

4.6.1合并执行多个赋值操作

a = 1
b = 2
c = 3

可以简化为下面只有一行:

a, b, c = 1, 2, 3

这样就能轻松地将 1、2、3 分别赋值给变量 a、b、c。如果对一组不相关的变量进行多重赋值,程序会变得难懂,因此建议对彼此相关变量进行多重赋值。 即使= 左右两边列表的数量不相等,Ruby 也不会报错。左边被赋值的变量的个数比较多时,Ruby 会自动将 nil 赋值给未分配值的变量。

a, b, c, d = 1, 2 
p [a, b, c] #=> [1, 2, nil]

变量部分比较少时,Ruby 会忽略掉该值,不会分配多余的值。

a, b, c = 1, 2, 3, 4 
p [a, b, c] #=> [1, 2, 3]

变量前加上*,表示 Ruby 会将未分配的值封装为数组赋值给该变量。

a, b, *c = 1, 2, 3, 4, 5
p [a, b, c] #=> [1, 2, [3, 4, 5]] 
a, *b, c = 1, 2, 3, 4, 5 
p [a, b, c] #-> [1, [2, 3, 4], 5]

4.6.2 置换变量的值

现在我们来考虑一下如何置换变量 a、b 的值。通常,我们需要一个临时变量 tmp 暂时地保存变量的值。

a, b = 0, 1 
tmp = a # 暂时保存变量a 的值 
a = b # 将变量b 的值赋值给a 
b = tmp # 将原本变量a 的值赋值给变量b 
p [a, b] #=> [1, 0]

使用多重赋值,只需一行程序就搞定了。

a, b = 0, 1 
a, b = b, a # 置换变量a、b 的值 
p [a, b] #=> [1, 0]

4.6.3 获取数组的元素

ary = [1, 2]
a, b = ary
p a   #=> 1
p b   #=> 2

4.6.4 获取嵌套数组的元素

我们来看看数组 [1, [2, 3], 4],用之前介绍的方法,我们可以分别取出 1,[2, 3]、4 的值。 ary = [1, [2, 3], 4]

ary = [1, [2, 3], 4] 
a, b, c = ary
p a #=> 1 
p b #=> [2, 3] 
p c #=> 4

像下面那样把左边的变量括起来后,就可以再进一步将内部数组的元素值取出来。

ary = [1, [2, 3], 4] 
a, (b1, b2), c = ary # 对与数组结构相对应的变量赋值 
p a #=> 1 
p b1 #=> 2 
p b2 #=> 3 
p c #=> 4

只要等号左边的变量的结构与数组的结构一致,即使再复杂的结构,多重赋值都可以轻松对应。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容