Ruby之基本数据类型(三)

前言

上一节我们介绍了常量以及变量的用法,这一节我们开始来介绍Ruby中的一些基本类型。

数值类型(Fixnum、Bignum、Float)

  Ruby的数值类型包括整数和浮点数。整数包括Fixnum和Bignum两种类型,其中Fixnum可以容纳比一个物理字长少一位的整数。当一个整数超过Fixnum范围时,它会自动转换成Bignum类型,而Bignum类型的范围只能被物理内存所限制。

  如果对一个Bignum类型的整数进行算术计算,最后的结果使得它可以用一个Fixnum保存,那么结果就会一个Fixnum对象返回。

下面我们来看看这段代码:

class Test
  # 定义一个名为a的变量,值为2的30次方减1
  a = 1073741823
  puts a.class
  # 定义一个名为b的变量值为2的30次方
  b = 1073741824
  puts b.class
end

结果输出:

Fixnum
Bignum

(1)通常来说,定义一个变量的值为大于或等于2的30次方的整数时,系统自动将其设为Bignum类型;如果小于该值,则设置为Fixnum类型。

(2)整数前面可以带一个可选的符号标记(用以指定是正数还是负数)、一个可选的进制标记符(0代表十进制,0x代表十六进制,0b代表二进制),然后跟一串相应进制的数字串。

(3)若在数值中使用下划线,则数值中的下划线将被忽略。

(4)注意:Ruby里的基本数据类型也就是一个对象,如在JS中,我们获取一个数值的绝对值用的Math.abs(5),而在Ruby中5就是一个对象,则其取绝对值,则是5.abs(),由此可以看出Ruby才是真正的面向对象,一切皆对象。

所有整数实际上是Fixnum或者Bignum类的实例,因此完全可以执行这两个类的方法,比如迭代器,如times、upto、downto、step,以此来取代传统的for循环。如:

class Test
  # 迭代输出三次
  3.times{print "X "}
  puts "\n"
  # 从1迭代到5
  1.upto(5){ |i| print i," "}
  puts "\n"
end

(5)通过在ASCII字符串前添加“?”来获取它对应的整数值,注意因为问号“?”后面跟的是ASCII字符而不是字符串,因此不需要使用引号,也不能有多个字符。

class Test
  puts ?a
end

当你运行时,你会惊喜发现居然输出a,后得知原来这是在Ruby1.8是这么用的,之后是这么用的

class Test
  puts "a".ord
  # 或者
  puts ?a.getbyte(0)
end

(5)通过字符串前加英文问号(?),然后取getbyte(0)即可或者通过给ASCII字符串加上双引号然后调用ord方法即可。

(6)当使用科学计数法来表示浮点数时,如果e的前面部分是一个整数,则要么完全忽略小数点,要么在小数点后增加0。如下所示

class Test
  puts 5e2
  puts 5.0e2
end

若是  puts 5.e2 肯定会报错,我们前面讲到数值也是对象,此时会将5作为对象,然后调用e2方法,但该方法根本不存在,则出错。

字符串 (String)

在Ruby语言中,字符串是String类的实例,因此任意的字符串变量、常量都可调用String类的实例方法,String类可能是Ruby中最大的内建类,它有超过75个标准方法,足以说明其是一个非常重要的类。其实在Ruby在单引号的字符串和双引号的字符串本质上是相同的,只不过用双引号会免去许多不必要的操作所带来的麻烦。

class Test
  a = "Hello World"
  b = ‘Hello World‘
  puts a == b
end

通过打印出true知,都是一样的。

字符串的%表示法

若我们希望一个字符串是有多行字符串组成,则可以使用"%"表示法。“%”表示法一共有三种方法:

(1)%/stuff/

(2)%Q/stuff/

(3)%q/stuff/

上述(1)和(2)用法一样,斜杠代表分隔符也可以为括号。

下面以%Q和%q来进行演示:

class Test
 # 定义一个全局变量
  $global = "Ruby"
  # 使用%Q/stuff/来生成多行字符串
  a = %Q/
  Hello,Ruby
  Ruby is Simple Language
  Ruby On Rais #{$global}/
  # 使用%q/stuff/来生成多行字符串
  b = %q{
  Hello,Ruby
  Ruby is Simple Language
  Ruby On Rais #{$global}}
  puts a
  puts b
end

#{$global} 为插值表达式利用定义的全局变量进行替换,在上述中当使用花括号时,此时插值表达式将会失效。

多行字符串的字面值

Ruby也提供了一种多行字符串的表现形式,这种语法也被成为Here Document。Here Document的最常用语法格式如下:

class Test
  <<标识符
  stuff
标识符
end

下面我们来举个例子:

$global = 123
# 使用Here Document定义了一个字符串
puts <<Here
    这是一个多行文本内容
    使用Here文档语法
    Sum = #{$global + 1}
Here

结果打印出:

    这是一个多行文本内容
    使用Here文档语法
    Sum = 124

一般我们建议将结尾的<<进行顶格书写。

数组 (Array)

Ruby中的数组可以使用一系列在方括号中用逗号分隔的对象引用来定义,方括号的最后一个逗号会被忽略。如下所示:

a = [4, 5 , "Hello World"]

注意:Ruby语言里数组的长度是可变的,当我们指定中间某个数组元素的值后,会导致该元素前面没有指定值的数组元素的值都是nil。

Ruby里的数组是Array类的实例,我们可以通过创建Array类的实例来创建数组,如下所示:

my_array = Array.new

数组的%表示方法

Ruby语言还可以把一个包含多个空格的字符串转换成数组。Ruby会把空格当成数组分隔符,每个空格分隔的子串都会被当成一个数组元素。如果我们需要将多个空格的字符串转换成数组,则需要使用"%w{...}或者%W{...}"表示法,这两种方法功能大致相同,但是"%W{...}"会进行更多额外的替换。

$global = 6
my_array = %w(Hellow Ruby On Rails,
      Ruby\ on\ Rails Is Funny! #{$global})
my_array2 = %W(Hellow Ruby On Rails,
      Ruby\ on\ Rails Is Funny! #{$global})
p my_array
p my_array2

结果打印:

["Hellow", "Ruby", "On", "Rails,", "Ruby on Rails", "Is", "Funny!", "\#{$global}"]
["Hellow", "Ruby", "On", "Rails,", "Ruby on Rails", "Is", "Funny!", "6"]

数组常用方法

(1)截取数组的字数组

# 定义一个Range对象
my_range = 1..9
# 将Range对象转换成数组对象
my_array = my_range.to_a
p my_array

# 从数组的第3个元素开始截取,共截取2个元素
p my_array[2, 2]

# 从数组的第3个元素开始截取,截取到第5个元素,包含第5个元素
p my_array[2..4]

# 从数组的第3个元素开始截取,截取到第5个元素,不包含第5个元素
p my_array[2...4]

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4]
[3, 4, 5]
[3, 4]

(2)为多个数组赋值

# 定义一个Range对象
my_range = 1..9
# 将Range对象转换成数组对象
my_array = my_range.to_a

# 从第3个元素开始,一共将2个元素替换成一个字符串元素
my_array[2, 2] = "Ruby"
p my_array

# 从第3个元素开始,一共将1个元素替换成2个元素
my_array[2, 1] = ["Hello", "World"]
p my_array

# 将第3个元素、第4个元素替换成7、8、9三个元素
my_array[2..3] = [7, 8, 9]
p my_array

打印出:

[1, 2, "Ruby", 5, 6, 7, 8, 9]
[1, 2, "Hello", "World", 5, 6, 7, 8, 9]
[1, 2, 7, 8, 9, 5, 6, 7, 8, 9]

范围 (Range)

范围是多个枚举的一种表现形式,创建该枚举形式的范围有两种形式。

(1)值1..值2:定义一个值1到值2的范围,包括值1和值2,也包括值1和值2中间的值。

(2)值1...值2:定义一个值1到值2的范围,包括值1但不包括值2,也包括值1和值2中间的值。

常用方法

(1)to_a():将该范围转换成一个数组。

(2)include()?(Targetvalue)===(tagetValue):判断该范围是否包含了tagetValue。

(3)min()/begin()/first():求该范围的最小值(第一个值)。

(4)max()/end()/last():求该范围的 最大值(最后一个值)。

以下为常用的迭代器方法:

(1)reject:将该范围转换成一个数组,并剔除掉满足条件的元素。

class Test
  # 使用...定义范围,则该范围不包括终点
  a = 2...10
  # 将范围转换成数组,且排除不满足条件的元素
  print a.reject {|i| i < 5}
  puts "\n"
end

打印出: [5, 6, 7, 8, 9]

(2)select:将该范围转换成一个数组,只选择满足条件的元素。

class Test
  # 使用...定义范围,则该范围不包括终点
  a = 2...10
  # 将范围转换成数组,且只选择满足后面条件的元素
  print a.select {|i| i < 5}
  puts "\n"
end

打印出: [2, 3, 4]

(3)each:迭代范围里的每个元素。

class Test
  # 使用...定义范围,则该范围不包括终点
  a = 2...10
  # 使用each迭代输出范围里的每个元素
  a.each do |ele|
    puts "当前元素时:" + ele.to_s
  end
end

打印出:

当前元素时:2
当前元素时:3
当前元素时:4
当前元素时:5
当前元素时:6
当前元素时:7
当前元素时:8
当前元素时:9

结语

这一节我们细讲并学完基本数据类型,下一节我们将进入表达式和语句。

时间: 2024-11-02 23:38:56

Ruby之基本数据类型(三)的相关文章

Oracle之PL/SQL学习笔记之数据类型(三)

Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到动态执行程序,同时也可以利用变量在PL/SQL内部进行值得传递,甚至可以把值传递出去,最终返回给用户,由此可见,变量是PL/SQL不可或缺的一部分. 1. Oracle预定义的普通数据类型(常见的数据类型) 类型 子类 说明 Oracle中的范围 char Character,String Rowi

Py西游攻关之基础数据类型(三)-元组

Py西游攻关之基础数据类型 - Yuan先生 https://www.cnblogs.com/yuanchenqi/articles/5782764.html 六 tuple(元组) 元组被称为只读列表,即数据可以被查询,但不能被修改,所以,列表的切片操作同样适用于元组. 元组写在小括号(())里,元素之间用逗号隔开. 虽然tuple的元素不可改变,但它可以包含可变的对象,比如list列表. 构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则: tup1 = () # 空元组

Ruby on Rails Tutorial 第四章 Rails背后的Ruby 之 其他数据类型

1.数组和值域 2.块 约定:当块中只有一行简单的代码时使用花括号形式:当块是一行很长的代码,或者有很多行时使用do..end形式.例如: >> (1..5).each{|i| puts 2*i} (1..5).each do |i| puts 2*i puts '-' end >> 3.times{puts "betelgeuse"} >> (1..5).map{|i| i**2} >> %w[a b c].map{|char| cha

python3基础二——基本的数据类型三

一.字符串str 1.创建字符串,为变量分配一个值 1 word='字符串' 2 sentence="字符串\n" #python中单引号和双引号使用完全相同 3 paragraph="""这是一个段落 4 可以有多行组成""" #使用三引号('''或""")可以指定一个多行字符串 5 print(word,sentence,paragraph) 6 -----------------------

redis数据类型三之set的操作命令

1.还是看看redis的官方文档:               如图示,redis set 是一种不重复的字符串集合,(它和 list 数据类型的差别就是在不重复上),执行 SADD指令可以添加新的元素到一个 set 集合中.也可以对 set 执行一些其他的操作,如判断一个给定的元素是否已经存在到呢个.(和 list 数据类型一样,是单 key 多值). 2.set 的一些操作指令: a.sadd/smembers/sismember: 追加或者新建一个 set 集合/查寻一个 set 集合/判

《Distributed Programming With Ruby》读书笔记三 Hello World Rinda and TupleSpace (Part1.2-1)

Chapter2: Rinda Including 7 parts: "Hello World" the Rinda Way Understanding Tuples and TupleSpaces Callbacks and Observers Security with Rinda Renewing Rinda Services Conclusion Endnotes When reviewing all of our DRb applications, you will noti

5、数据类型三:hash

Hash数据类型使用很普遍,它同样是key-value的方式来组织的,只是其value又包含多个field-fieldValue对.想要获取某个fieldValue,可以通过key-field联合来定位. 图1. hash类型数据组织形式 从上“图1”可以很好的hash数据的组织形式和用途.比如,系统里面有很多用户,那么如何在redis里面存放用户信息呢?“图1”就展示了如何使用hash数据类型来存放用户信息,使用key来唯一标识用户id,value分别对应用户的“名字.年龄”等信息. 1.常用

万恶之源 - Python基础数据类型三

字典 字典的简单介绍 字典(dict)是python中唯?的?个映射类型.他是以{ }括起来的键值对组成. 在dict中key是 唯?的.在保存的时候, 根据key来计算出?个内存地址. 然后将key-value保存在这个地址中. 这种算法被称为hash算法, 所以, 切记, 在dict中存储的key-value中的key必须是可hash的, 如果你搞不懂什么是可哈希, 暂时可以这样记, 可以改变的都是不可哈希的, 那么可哈希就意味着不可变. 这个是为了能准确的计算内存地址?规定的. 已知的可哈

MySQL基础知识03数据类型(三)日期时间相关类型

1. DATE DATE类型只包含日期,格式:'YYYY-MM-DD'.范围从'0000-01-01'到'9999-12-31'.其中年月日只能输入有效的年月日. mysql> create table d1 ( id  date primary key); Query OK, 0 rows affected (0.02 sec) mysql> show create table d1; +-------+--------------------------------------------