Ruby 开发(二)- Ruby基础语法(上)

369 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

一、变量与常量

常量

在应用中一些固定值、不希望被修改的值可以定义为常量,Ruby中的常量和变量无须指定数据类型,为了更好的可读性,通常将常量名的字母全部大写,而变量的名字使用小写字母或者下划线开头。

URL = "https://juejin.cn"
puts "稀土掘金的URL地址是:" + URL

URL = "https://guides.rubyonrails.org/v6.0/index.html"
puts "Rails 6.0 的文档地址是:" + URL

执行以上代码,输出结果如下: image.png 在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

image.png

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

image.png 从运行结果来看,不管是使用..还是...定义的范围,左边界的值和中间的值都是可以取到的,..定义的范围右边界也可以取到,但是...定义的范围右边界是获取不到的。 范围是一个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"

运行上述代码,生成结果如下: image.png 只要用于生成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

对同一个字符串对象,使用%:创建的字符对象是相等的。