持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
一、变量与常量
常量
在应用中一些固定值、不希望被修改的值可以定义为常量,Ruby中的常量和变量无须指定数据类型,为了更好的可读性,通常将常量名的字母全部大写,而变量的名字使用小写字母或者下划线开头。
URL = "https://juejin.cn"
puts "稀土掘金的URL地址是:" + URL
URL = "https://guides.rubyonrails.org/v6.0/index.html"
puts "Rails 6.0 的文档地址是:" + URL
执行以上代码,输出结果如下:
在Ruby中,如果出现一个常量重复定义的情况,编辑器仅仅会给出警告但是不会报错。
变量
Ruby中可以将变量分别定义为局部变量和全局变量,全局变量是最顶级的变量,在方法、模块和类中均可以访问;局部变量只能在所处的作用域被访问,其他区域访问则会报错。
为了与常量区分,局部变量必须以小写字母或者下划线开头。局部变量有自己的作用域,这个作用域可以是类、模块和方法。
# Ruby 中局部变量的定义
# 在类中定义局部变量
class Hero
_info = "这是在类中定义的局部变量"
puts _info
end
# 在模块中定义的局部变量
module ModuleInfo
_info = "这是在模块中定义的局部变量"
puts _info
end
# 在方法中定义局部变量
def info
_info = "这是在方法中定义的局部变量"
puts _info
end
在Ruby中方法名也是以小写字母或者下划线开头,如果方法没有参数()是可以省略的。
全局变量,作用域是全局,在任何地方都可以访问该变量,Ruby中定义全局变量要以$开头
# Ruby 中全局变量的定义
$info = "这是一个全局变量"
class Hero
_info = "这是类中的局部变量"
# 类中打印全局变量
puts $info
puts _info
end
module ModuleInfo
_info = "这是模块中的局部变量"
puts $info
puts _info
end
def info
_info = "这是方法中的局部变量"
puts $info
puts _info
end
除了可以自定义全局变量外,Ruby本身提供了一些类全局变量
| 全局变量 | 说明 | |
|---|---|---|
| $! | 最近一次的错误信息 | |
| $@ | 错误产生的位置 | |
| $_ | gets最近读的字符串 | |
| $. | 解释器最近读的行数(line number) | |
| $& | 最近一次与正则表达式匹配的字符串 | |
| $~ | 作为子表达式组的最近一次匹配 | |
| $n | 最近匹配的第n个子表达式(和$~[n]一样) | |
| $= | 是否区别大小写的标志 | |
| $/ | 输入记录分隔符 | |
| $\ | 输出记录分隔符 | |
| $0 | Ruby脚本的文件名 | |
| $* | 命令行参数 | |
| $$ | 解释器进程ID | |
| $? | 最近一次执行的子进程退出状态 |
# 输出 Ruby 中所有的全局变量
puts global_variables
二、数据类型
Ruby中常用的三大基本数据类型为:数值型、范围、符号。
数值型
在 Ruby 中,所有数值都是Numeric类的子类对象,数值都是不可变对象。Integer是整数,Float是浮点数类型,Rational是分数。
在 Ruby 2.4 以前,整数要模式Fixnum要么是Bignum,Bignum是较大的整数类型(大于2的30次方),其余数值为Fixnum,Fixnum和Bignum之间可以相互替换 在 Ruby 2.4 之后,Fixnum 和 Bignum 统一合并为Integer,不再对用户暴露 Bignum 和 Fixnum
# Ruby 中 Integer Float Rational
int_data = 2 ** 30 + 1
int_data_02 = 2 * 30 - 1
puts int_data.class
puts int_data_02.class
float_data = 1.0
puts float_data.class
rat_data = Rational(2,3)
puts rat_data
puts rat_data.class
rat_data_02 = 2/3r
puts rat_data_02
puts rat_data_02.class
rat_data_03 = 3.to_r
puts rat_data_03
puts rat_data_03.class
rat_data_04 = Rational('0.3')
puts rat_data_04
puts rat_data_04.class
rat_data_04 = '0.3'.to_r
puts rat_data_04
puts rat_data_04.class
Rational表示分数,可以通过Rational对象显示的创建分数类型,也可以从浮点数通过调用to_r创建;在 Ruby 中可以调用class来获取对象的类型,相当于Python中的type()函数
范围
范围在其他编程语言中可能使用枚举来表示,范围就是多个枚举值的一种简单表达形式。在 Ruby 中定义范围(Range)只需要使用..或者...定义两个边界,这两个边界中间的内容就是一个范围。
# 第一种定义方式
zulu = left..right
yankee = left...right
# Ruby 中的范围
zulu = 1..5
yankee = 1...5
puts zulu===1
puts yankee===1
puts zulu===5
puts yankee===5
puts zulu===1.5
puts yankee===1.5
puts zulu===2
puts yankee===2
从运行结果来看,不管是使用
..还是...定义的范围,左边界的值和中间的值都是可以取到的,..定义的范围右边界也可以取到,但是...定义的范围右边界是获取不到的。
范围是一个Range对象,可以通过to_a方法将范围转换为一个数组,Range对象包含了以下几个常用的方法:
to_a,将范围转换成一个数组
to_s,转换为String类型
include?(target),判断范围内是否包含target
min()、begin()、first(),都是获取范围的最小值
max()、end()、last(),都表示最大值
a = 0..5
b = 6...10
c = b.to_a
d = b.to_s
puts "数组c的元素为:", c
puts "数组c的类型为:", c.class
puts "字符串d:" + d
puts "字符串d的类型为:", d.class
puts "范围b的类型为:", b.class
puts "输出a范围的最小值"
puts a.min
puts a.first
puts a.begin
puts "输出a范围的最大值"
puts a.max
puts a.end
puts a.last
puts "b范围是否包含9:", b.include?(9)
puts "b范围的长度为:", b.size
运行上述代码,输出结果为:
数组c的元素为:
6
7
8
9
数组c的类型为:
Array
字符串d:6...10
字符串d的类型为:
String
范围b的类型为:
Range
输出a范围的最小值
0
0
0
输出a范围的最大值
5
5
5
b范围是否包含9:
true
b范围的长度为:
4
Range对象还可以调用以下三个常用的迭代器方法:
- regect,将指定范围转换成一个数组,并删除满足条件的元素
- select,将指定范围转换成一个数组,只选择满足条件的元素
- each,输出范围内的每个元素
符号
Ruby 中符号(Symbol)也是一个对象,符号对象时一个字符串、一个方法、一个类或者一个标识符的内部表现形式,创建符号对象只需要在对象前面加上:即可。
# Ruby 中的符号对象
name = "Stark"
_name = :name
puts name.class
puts _name.class
puts _name === :"name"
def charlie
puts "C for Charlie"
end
c = :charlie
puts c.class
puts c==:"charlie"
运行上述代码,生成结果如下:
只要用于生成Symbol对象的对象名相同(既冒号后面的对象),则对应的符号对象就是相等的。符号对象和字符串对象可以通过to_s方法和to_sym方法来相互转化
str = "stark"
sym = :"stark"
puts str.class
puts sym.class
puts (str.to_sym).class
puts (sym.to_s).class
除了使用:创建符号对象外,还可以通过%来创建符号对象
d = "delta"
_d = %s{d}
__d = :d
puts _d.class
puts _d === __d
执行上述代码,控制台输出内容如下:
Symbol
true
对同一个字符串对象,使用%和:创建的字符对象是相等的。