美文网首页
Ruby or Rails 学习总结 2

Ruby or Rails 学习总结 2

作者: Qo_Tn | 来源:发表于2020-03-30 11:34 被阅读0次

    Qo_Tn


    第三章学习

    3.1 创建字符串

    1. String:

      • 单引号或双引号 创建。
      • 单引号字符串 只能进行最少替换。
      • 双引号字符串 对于括起来的字符串能进行更多替换。 例如替换转义字符串和其他特殊字符。
      字符串 含义
      \a 替换成Bell 声所对应的符号
      \nnn nnn表示一个八进制数值,替换成该八进制所对应的字符
      \b 退格符,替换成退格键所对应的字符
      \xnn xnn 表示一个十六进制数值,替换成该十六进制数所对应的字符
      \e 替换Escape键所对应的字符
      \cx 替换成Ctrl+X 组合键所对应的字符,其中x可以是任意键对应的字符
      \C-x 替换成Ctrl+X 组合键所对应的字符,其中x可以是任意键对应的字符
      \n 换行符,替换成一个空行
      \M-x 替换成Alt+X 组合键所对应的字符串,其中x可以是任意键对应的字符
      \r 回车符,替换成一个回车
      \M-\C-x 替换成Ctrl+Alt+X组合键所对应的字符串,其中x可以是任意键对应的字符
      \s 空白符,替换成一个空白字符
      \t 替换成一个Tab键所对应的字符
      \v 替换成一个垂直Tab键所对应的字符
      #{expr} 替换成变量或者表达式expr所对应的值

    3.2 操作字符串

    1. String类 和 Sysbol类

      • 这两个类提供了文本功能,通过使用这两个类中的方法可以操作字符串。
      • '+' 合并 两个或两个以上 字符串
      • '<<' 为已有字符串变量永久性地增加另一个字符串。
      • '#{}' 嵌入字符串变量,返回新的字符串
      • 拼接字符串还可以使用乘法运算,即一个字符串复制出相应倍数字符串的链接
      • 内置 replace 方法可以替换字符串中的内容
      • dup、clone 方法 来复制字符串
      • dup 只能复制字符串的内容
      • clone 除了内容以外,还继承了特殊方法、污染(taint)、冻结(freeze)等信息
      • 改变字符串 的 方法
      方法 说明
      capitalize 将字符串首字母转换为大写
      upcase 将字符串中所有的字母转换为大写
      downcase 将字符串中所有的字母转换为小写
      swapcase 将字符串中大写字母转为小写,小写字母转为大写
      strip 去掉字符串中的首尾空格
      Lstrip 去掉字符串中左边的空格
      Rstrip 去掉字符串中右边的空格
      Chop 删除字符串中的最后一个字符
      chomp 删除字符串中的最后的换行符
      reverse 将字符串中反转过来
      • 获取字符和子字符串 用 '[ ]' , '[ ]' 方法的参数是字符的索引,该方法返回一个字符,可以使用ord方法把字符转换为 ASCII 值。为 [ ] 方法添加两个参数,还可以从字符串中获取指定长度的子字符串。
      • 当字符串索引: 正左负右,正0负-1 。
      • '==' 比较是否相等
      • '<=>' 比较字符串的大小 -1 0 1

      例如:

      puts "-------------------------------------------------------------------------- "
      #合并字符串
      a="合并"
      b="字符串"
      c=a+b
      puts c
      puts "-------------------------------------------------------------------------- "
      a<<b   # 为已有的字符窜增加另一个字符串
      puts a
      puts b
      puts "-------------------------------------------------------------------------- "
      puts "#{a}#{b}"
      puts "-------------------------------------------------------------------------- "
      puts "#{a}#{b}"*3
      
      puts "-------------------------------------------------------------------------- "
      #替换字符串
      str="替换的字符串"
      a=str
      str.replace("这里用来替换内容")
      puts str
      puts a
      
      #复制字符串
      str="复制字符串的内容"
      puts str.dup
      puts str.clone
      
      #改变字符串
      str="abcdefgWWW,大写"
      puts str.upcase
          
      #获取字符和子字符串
      str="abcdefgWWW.help"
      puts str[2]
      puts str[7].ord
      puts str[4,5]
      puts str[-3]
      puts str[100]
      #比较字符串
      str="比较字符串,str"
      itzcn="比较字符串,itzcn"
      if str==itzcn
          puts "这两个字符串内容想等"
      else
          puts "这两个字符串内容不相等"
      end
      
      #大小
      puts 'a'.ord                #输出a的ASCII 值
      puts 'b'.ord                #输出b的ASCII 值
      puts 'b'<=>'a'            #比较大小,将返回1
      if ("a">"b")        # 比较大小,将返回false
          puts "a大于b"
      else
          puts "a小于b"
      end
      

    3.3 Hash对象

    1. 哈希表时最常用的索引集合之一,用来保存数据
    2. Hash 类似于 Dictionary
    3. 可动态 添加实例

    Hash对象 常用的方法:

    方法 说明
    size() 返回Hash对象的长度
    length() 返回Hash对象的长度
    include?(key) 判断指定的Hash 对象 是否包含指定的key
    has_key?(key) 判断指定的Hash 对象是否包含指定的key
    delete(key) 删除Hash 对象中指定key的对应元素
    keys() 返回由Hash 对象中全部key组成的数组
    values() 返回由Hash对象中全部value 组成的数组

    Hash对象 的迭代器方法:

    迭代器方法 说明
    each 迭代输出Hash对象里面的全部元素(包括key 和 value)
    each_key 迭代输出Hash对象里面所有key
    each_pair 迭代输出Hash对象里所有key-value对
    each_value 迭代输出Hash对象里所有value
    #Hash 对象
    person={    #创建Hash对象
        "name"=>"Tom",
        "age"=>25,
        "sex"=>"男"
    }
    
    puts person
    
    persons=Hash.new    #创建Hash类实例
    persons["name"]="Tom"        #添加元素
    persons["age"]=25
    persons["sexx"]="男"
    puts persons
    
    puts persons.size()
    puts persons.length()
    puts persons.include?("name")
    puts persons.has_key?("age")
    persons.delete("sexx")
    puts persons
    
    puts persons.keys()
    puts persons.values()
    
    
    # Hash 迭代方法
     persons.each do |name|
            p "1#{name}"
     end
    
    p persons.each_key
    p persons.each_pair
    p persons.each_value
    

    3.4 数组

    1. 数组事数据对象的集合
    2. 带有索引的集合,都是动态的,长度可变
    3. 数组的索引 可以为正数,也可以为负数,正0负-1 原则
    4. 使用size方法来访问数组的长度

    将多个空格的字符串转换为数组,使用%w{...}或者%W{...}表示法,这两种表示法功能大致相同。使用大些W的方法,会对内部转义字符和特殊字符进行替换。

    方法 说明
    unshift() 向数组的头部添加数组元素
    push() 向数组的尾部添加数组元素
    << 向数组的尾部添加一个数组元素
    shift 向数组头部删除数组元素
    pop 向数组的尾部删除数组元素
    array[n,m] 截取从索引n开始,长度为m的元素列表,组成新数组
    array[n..m] 截取从索引n开始, 到索引m的元素列表(包括索引m的数字元素),组成新数组
    array[n...m] 截取从索引n开始,到索引m的元素列表(不包括索引为m的数组元素), 组成新数组

    例如:

    #数组
    food=["大米","小米","黑米","虾米","红米","玉米","粟米"]
    p food
    
    food[5]="水果"
    p food
    
    food[8]="玉米"
    p food
    
    food=Array.new
    food[0]="大米"
    p food
    
    str=%W{上海\s自来水\s来自\s海上}   #使用%W
    str2=%w{上海\s自来水\s来自\s海上}   #使用%w
    p str
    p str2
    
    #添加删除
    food.unshift("小米")
    food.push("黑米")
    food<<"玉米"
    
    p food
    
    #food.shift
    #food.pop
    #p food
    
    a=food[1,2]
    b=food[1..2]
    c=food[1...2]
    
    p a,b,c
    
    food_1=["大米"]
    food_2=["小米","香蕉"]
    food_1.concat(food_2)
    p food_1
    p food_2
    

    3.5 类型转换

    1. 类型转换

      方法 说明
      to_s 将获取的对象转换为字符串
      to_i 将获取的对象转换为整数
      to_f 将获取的对象转换为浮点
    class Computer              #定义Computer 类
        def initialize(name)        #定义构造函数
            @name=name
        end
        def to_s                    #定义to_s方法
            "电脑型号: #{@name}"
        end
    end
    
    computer=Computer.new("方正") #实例化Computer 类
    puts computer.to_s          # 调用to_s方法
    puts computer                  # 输出car对象
    
    
    pinpai="诺基亚"
    xinghao="5000"
    color="紫色"
    shangshi_date="2008年5月"
    price="410"
    sale=0.8
    
    puts "品牌:"+pinpai
    p "型号:"+xinghao
    p "颜色:"+color
    p "上市时间:"+shangshi_date
    p "市场价格:"+price
    p "优惠价格:"+(price.to_i*sale).to_s
    

    第四章学习

    4.1 面向对象

    1. 对象、类、对象的状态、对象的行为、类的关系、对象的消息
    2. 封装、继承、多态

    4.2 创建类

    1. 类的定义和使用

      • class 声明 end 结束
      class Animal
      # 这里写类的结构
      end
      
    2. 类中的表达式

      #类的表达式
      class Animal
      puts "这里定义了一个Animal类"
      puts "这里在Animal类中打印了两行文本"
      end
      
    3. self 关键字

      class Animal
          puts self
          puts self.class
          def put 
              puts self
              puts self.class
          end
      end 
      
      a = Animal.new
      a.put
      
    4. 追加类

      • 定义好一个类以后,还可以对其进行追加操作。只要是同名的类,对其进行添加功能。在使用类时,系统会自动将两个或多个同名的类合并使用。
      class Animal
          def put
              p "这是put方法"
          end
      end
      
      class Animal
          def show
              p "这是show方法"
          end
      end
      
      a=Animal.new
      a.put
      a.show    
      
    5. 嵌套类

      • 类中声明另外一个类
      • 嵌套类用‘ :: ’来引用
      class Animal
          class Head
              def put
                  puts "这里Head类里的put方法"
              end
          end
      end
      
      h=Animal::Head.new
      h.put
      
    6. 特殊类

      • 在Ruby 中还允许为某个特定的对象追加一些方法和属性,这些方法和属性封装到一个类中直接追加到对象中。这个类没有特定的类名,所以并不能作为普通的类使用,所以我们称其为特殊类。
      class Animal
      #一个空的Animal类
      end
      a=Animal.new
      class <<a
          def put
              puts "这个是特殊类的put方法"
          end
      end
      a.put   
      

    4.3 方法

    1. 方法是类中执行其行为的成员,类的所有行为都将以方法的形式来进行执行和处理
    2. 脱离了类,也可以使用方法,不过在没有类的情况下定义的方法我们通常称之为“函数”

    方法 如下

    def methodName(arg1, arg2, ....argN)
           #方法体
    end
    
    1. 参数可以不用括号来标识,如果省略括号,方法名和参数列表之间需要有空格进行分隔,调用方法时使用的括号也可以省略。
    class Animal
       def eat(food)
           puts "这个动物正在吃"+food
       end
    end
    ani=Animal.new
    ani.eat("馒头")
    
    1. 参数的默认值

      class Dog
          def eat(food="骨头")
                  puts "小狗正在吃"+food
          end
      end 
      dog=Dog.new
      dog.eat("肉")
      dog.eat
      
    2. 方法的返回值

      class Dog
          def GetHobi
              "肉"
          end
      
          def GetWeight
              return "12kg"
          end
      end
      
      dog=Dog.new
      
      puts "小狗喜欢吃#{dog.GetHobi}"
      puts "小狗的体重为#{dog.GetWeight}"
      
    3. 特殊方法

      class Dog
          # 一个空的Dog类
      end
      dog=Dog.new
      def dog.show
          puts "我是一个只有12kg体重的小胖狗"
      end
      dog.show
      
    4. 定义类的方法

      • 类方法需要使用 类名 和 点运算符 做为方法名的前缀
      class Dog
          def Dog.show
              puts "我是一只有12kg体重的小胖狗"
          end
      end
      Dog.show
      
    • 类的方法 不一定要声明在类中,它可以在类的外部单独声明。
    • 类的方法 声明在类中,可以使用self关键字来代替类名

    4.4 实例变量 和 类变量

    1. 实例变量

      • 实例变量用于在类内部共享数据
      • 声明位置 顶部、顶部方法、类、类方法、模块、模块方法
      • 实例变量 以@开头
      @Name="Tom"
      
      class Cat
          @Color="黄色"
          def init
              @weight="3kg"
          end
          def show
                  puts "#@Name 是一只 #@Color 的有#@weight 体重的小懒猫"
          end
      end 
      cat=Cat.new
      cat.init
      cat.show
      
    2. 类变量

      • 位置与实例变量相同
      • 类变量需要 以两个“@”开头
      @@master="张浩华"
      class Cat
          def say
              puts "我是一只小懒猫,我的主人是#@@master"
          end
      end
      class Dog
          def say
              puts "我是一只小笨狗,我的主人是#@@master"
          end
      end
      cat=Cat.new
      cat.say
      dog=Dog.new
      dog.say
      

    4.5 属性

    1. 属性对类的外部提供了一个访问 类内部实例变量的接口,我们可以通过它来操作类的实例变量

    2. 属性读取器 和 设置器

      class Person
          def name
              @name
          end
      end
      p=Person.new
      puts p.name
      
    3. 如果要为类的实例变量 追加一个设置器,我们还要为其创建一个设置方法

    4. 设置实例变量值的属性方法比较特殊,命名时需要以等号“=”为后缀,并且必需设置一个方法参数

      class Person
          def name=(val)
              @name=val
          end
      end
      p=Person.new
      p.name="joker"
      
    5. 属性定义标识符

      • 四个标识符: attr 、attr_reader 、 attr_writer 、attr_accessor
      • 四个标识符为内建方法
      class 类名
          attr:attr1,key
          attr_reader:attr1,attr2
          attr_writer:attr1,attr2
          attr_accessor:attr1,attr2
      end
      
      • 这里的 :attr1 是类中实例变量的名称,不过这里要把实例变量名称的前缀at符号“@”换成冒号“:”
      • attr 根据布尔型数据key的值,定义一个可读写的属性。如果key的值为false,则设置属性的访问权限为只读
      • attr_reader 定义一个或多个只读的属性
      • attr_writer 定义一个或多个只写的属性
      • attr_accessor 定义一个或多个可以读写的属性
       class Dog
         attr:name,true
         attr_reader:weight
       end
      

    4.6 构造方法

    1. 构造方法是在实例化类时要执行的类的方法,且该方法在创建每一个类的实例的时候都会被调用。

    2. 构造方法 可以接收 0个或多个参数,这样就可以在初始化类的对象的时候 直接为该对象的实例变量设置初始值。

    3. 构造方法的名称统一为 initialize ,也就是说当调用类的 new 方法创建类的实例的时候,系统会自动调用 initialize 方法来初始化该对象。

      class Car
          def initialize(brand,color)
              @brand=brand
              @color=color
          end
          def show
              puts "这是一辆 #@color 的 #@brand 轿车。"
          end
      end
      car=Car.new("BYD","红色")
      car.show
      
      class Pekingese
          def initialize(name,color,hobi)
              @name=name
              @color=color
              @hobi=hobi
          end
          
          def sayHello
                  puts "汪汪"
                  puts "我是 #@name"
                  puts "我是 #@hobi"
          end
          
          attr_accessor :name, :color, :weight, :hobi
      end
      
      dog=Pekingese.new("小强","白色","吃肉")
      puts "这里我们得到一只 #{dog.color} 的小狗,\n让它来给我们打个招呼: \n汪汪 \n我是小强 \n我喜欢吃肉"
      
      dog.sayHello
      

    4.7 在方法中使用块

    • Ruby 重用性 => 代码块

    • 代码块用 话括号的方式 和 do-end 语句 的方式。

      {
          #代码块内容
      }
      
      do
          #代码块内容
      End
      
    • 代码块可以作为一个参数传递给方法,然后方法中可以使用yield 关键字调用传入的代码块

      def say
          puts "Hello"
          yield
          puts "Bye"
      end
      say do 
          puts "What you say?"
      end
      
    • 代码块添加参数,方法体中使用 yield 关键字调用代码块的时候传入参数,在带参数的代码块中需要以 “|arg1,arg2|” 的格式声明参数。

      def say
          name="joker"
          puts "Hello,I'm"+name
          yield name 
      end
      say do |name|
          puts "Hello,"+name
      end
      
    • 代码块不只能有参数,还可以具有返回值。和一般的方法一样,代码块的返回值也是使用最后一个表达式的值,而且在方法中也可以获取和使用代码块的返回值。

      def say
          puts yield
      end
      say do 
          "Hello,Joker"
      end
      

    4.8 类的继承

    • 继承可以共享父类的成员,实现代码的复用。

    • 继承可以使子类直接使用父类的方法和变量,等于说一个类的另外一个类开辟了特殊的访问权限。

    • 在类的继承中,被继承的类称为基类,也可以称为父类; 继承基类的类称为派生类,也可以称为子类。

    • 子类继承父类最大的特点就是实现饿了代码的重用,因为子类可以从父类中获取父类中已有的属性和方法。

    • 方法:'<' 后追加一个父类的名称即可

    • 子类继承父类的元素

    • super 关键字主动的调用父类的同名方法,如果父类的构造方法中有参数列表,可以使用super关键字追加这个参数列表。

      class Bird
          #这是一个鸟类
      end
      class Chick<Bird
          #这是一个小鸡类
      end
      class Bird
          def  initialize
              @wing=2
          end
      end
      class Chick<Bird
          def show
              puts "这只小鸡有 #@wing 只翅膀"
          end
      end
      chick=Chick.new
      chick.show
      

    4.9 访问作用域

    • 访问作用域关键字 private、protected、public

    • private 私有方法,被该方法指定的成员只可以被该类内部访问,成员对类外部是不可见的。

    • protected 保护方法,被该方法指定的成员可以被任何隶属的子类访问。

    • public 公有方法,被该方法指定的成员可以被任何类或对象调用,没有访问权限。(成员声明时默认就是 public、initialize 方法除外)

    • 声明类属性一样将方法名作为参数传递给三个作用域 控制方法来指定访问级别

      class Bird
          def fly # 前面没有访问修饰,默认为public
          end
          
          private  #定义为私有方法
          def eat
          end
      
          protected  # 定义为 保护的方法
          def run
          end
          
          public  # 定义为公有的方法
          def jump
          end
      end
      
      class Bird
      
          def fly
          end
          
          def eat
          end
          
          def run
          end
          
          def jump
          end
          private(:eat)                   # 定义为私有方法
          protected(:run,:jump)     # 定义为保护的方法
      end
      

    相关文章

      网友评论

          本文标题:Ruby or Rails 学习总结 2

          本文链接:https://www.haomeiwen.com/subject/wygmuhtx.html