• 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 "
    "
      # 从1迭代到5
      1.upto(5){ |i| print i," "}
      puts "
    "
    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 "
    "
    end

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

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

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

    结语 

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

  • 相关阅读:
    基于Redis的短链接设计思路
    再谈对协变和逆变的理解(Updated)
    Java基础—ClassLoader的理解
    遇到个小问题,Java泛型真的是鸡肋吗?
    一次失败升级后的反思
    JVM是如何分配和回收内存?有实例!
    一个Java对象到底占用多大内存?
    《深入理解Java虚拟机》读书笔记:垃圾收集器与内存分配策略
    快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示
    快速掌握RabbitMQ(一)——RabbitMQ的基本概念、安装和C#驱动
  • 原文地址:https://www.cnblogs.com/CreateMyself/p/5365881.html
Copyright © 2020-2023  润新知