• [Ruby学习总结]Ruby中的类


    1、类名的定义以大写字母开头,单词首字母大写,不用"_"分隔

    2、实例化对象的时候调用new方法,实际上调用的是类里边的initialize方法,是ruby类的初始化方法,功能等同于Java中的构造方法

    class Person
      def initialize(name, gender, age)
        @name = name
        @gender = gender
        @age = age
      end
    end

    3、可以使用attr_accessor关键字标记实例变量,为其提供读写方法,类似java中的get&set方法,如定义个最简单的model对象:

    class Person
      attr_accessor :name, :gender, :age
    end

    等同于:

    class Person
      def name
        @name
      end
      def name=(name)
        @name=name
      end
    
      def gender
        @gender
      end
      def gender=(gender)
        @gender=gender
      end
    
      def age
        @age
      end
      def age=(age)
        @age=age
      end
    end

    可见,使用了attr_accessor关键字,可以使代码更简洁易懂,此外,ruby中还提供读写分开的关键字:attr_writer(只写)、attr_reader(只读)。

    4、Ruby中没有接口,但是有更神奇的Module和Mix-in机制,注意:module中的静态方法只能通过模块名访问,实例方法只能通过include到类中,然后通过类的实例访问。

    module Foo
      PI = 3.14
      def m1
        puts 'Put out from m1!'
      end
    
      def Foo.m2
        puts 'Put out from m2!'
      end
    
      class Fooc
        def mfc
          puts 'Put out from Foo>>Fooc!'
        end
      end
    
      module Foos
        def mfs
          puts 'Put out from Foo>>Foos'
        end
      end
    end
    #通过module名访问,只能访问类一级的内容
    puts Foo::PI.to_s    #输出:3.14
    Foo::Fooc.new.mfc    #输出:Put out from Foo>>Fooc!!
    #Foo.m1               #无法访问,没有实例化
    Foo.m2                #静态方法通过模块名访问
    #引入后访问
    include Foo
    m1               #输出:Put out from m1!
    Fooc.new.mfc     #输出:Put out from Foo>>Fooc!!
    
    include Foos
    mfs              #输出:Put out from Foo>>Foos!

    可以来看看Module在实在应用中是怎么使用的:

    #鸭子类
    class Duck
      def swim
        print self.class , " can swim...
    ";
      end
    end
    
    #"会飞的"模块
    module FlyModule
      def fly
        print "    and I can fly...
    "
      end
    end
    
    #野鸭(会飞,会游)
    class Mallard < Duck
      include FlyModule #导入模块后,该类即具有模块中定义的方法(可以理解为实现了接口)
    end
    
    #家鸭(只会游泳)
    class Coot < Duck
    end
    
    m = Mallard.new
    m.swim
    m.fly
    c1 = Coot.new
    c1.swim
    #c1.fly               #无法调用,报错提示未定义
    #module中定义的方法也可以在实例中动态扩展
    c2 = Coot.new
    c2.extend(FlyModule)  #扩展c2对象引入FlyModule模块
    c2.swim
    c2.fly
    




  • 相关阅读:
    Java从静态代理到动态代理
    Redis持久化
    Linux top命令详解
    从Java线程到线程池
    NodeJs的学习
    使用<金蝶云星空集成开发平台>创建单据的操作步骤
    Maven项目的创建
    XCX_豆瓣电影
    小程序,新手上路
    更改Apache虚拟目录并授予权限 及 { 修改索引页 }
  • 原文地址:https://www.cnblogs.com/riskyer/p/3339500.html
Copyright © 2020-2023  润新知