美文网首页
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