Ruby-类

#类与对象
class Person
  def initialize(name,age,sex)      #initialize 方法,试用new方法生成新的对象时,该方法会被调用,同时new方法的参数会原封不动的传给该方法,因此初始化对象时需要的处理一般都写在这个方法中
    @name = name    #初始化实例变量
    @age = age
    @sex = sex
  end
#  attr_accessor :name,:age,:sex        #设置变量的方法:attr_reader为可读,attr_writer为可写,attr_accessor为可读写
  attr_accessor :age #将age属性标记为可读写
  def info                             #实例方法
    puts "my name is #{@name},I‘m #{@age},sex is #{@sex} "
  end
end
leijun = Person.new("BuSi Lei",20,"male")   #创建一个对象并初始化其属性
leijun.info
leijun.age = 50   #对leijun的age属性赋值
p leijun.age
p leijun.class

#父类与子类
class Person
  @@dna = "--~~~----~~~---"     #在父类中创建一个类变量@@dna
end

class Phone < Person      #创建一个子类Phone 继承 Person类的一部分属性
end
xiaomi = Phone.new("xiaomi4",3,"other")
xiaomi.info
xiaomi.age = 4
p xiaomi.age

class Phone
  @@dna = "FF-F0"               #在子类Phone中修改类变量@@dna,也会使父类中的同名类变量发生改变
  def info                      #为子类定义一个输出类变量属性的实例方法,与父类Person 中的实例方法同名,只会覆盖本身继承过来的方法,不会影响到父类
    puts "dna ? - #{@@dna}"
  end
end

class Person
  def sup
    puts "#{@@dna}"
  end
end

xiaomi.info
leijun.info         #输出无变化
leijun.sup          #@@dna的输出值被改变

#类实例变量     (类也是对象,一切皆为对象),不会被继承
class Person
  @race = "yello"
  def race
    puts "race is #{@race}"
  end
end
leijun.race               #输的结果可看出,在一个类中,一个实例变量不能访问类实例变量
xiaomi.race

#类方法
class Person
  @race = "yello"
  def self.race           #定义类方法,形如 def self.xxxxxx,来调用类的实例变量
    puts "race is #{@race}"
  end
end
Person.race               #直接使用类名.类方法名来调用类方法

#class Person            #定义类方法的第二种方法
#  class << self
#    def test
#      puts "class method"
#    end
#  end
#end

class Person
  def self.race=(race)  #定义一个形如self.xxx=(xxx)的方法,来修改类变量的属性
    @race = race
  end
end
Person.race = "Black" #修改属性
Person.race
Phone.race              #子类不能继承父类的类实例变量

class Phone
  @race = "Red"         #为子类创建一个类实例变量
end
Phone.race            #可以继承类方法,但不能继承类实例变量,通过子类自己创建的类实例变量,可以调用继承过来的类方法来输出结果

#限定方法访问的作用域   public,private,protected; public为默认模式
class Person
  private           #定于test方法的作用域; private 与 protected,都不能在外部访问test方法
  def test
    puts "Hello Thank you"
  end
end
#leijun.test       #结果报错,在对象外部不能调用私有的实例方法

class Person
  def test2       #定义一个test2方法调用内部test方法
    test
  end
  protected         #设置为private或者protected 都能test2方法调用
    def test
    puts "Hello Thank you"
  end
end
leijun.test2
xiaomi.test2
leijun.send(:test)     #通过send方法能直接调用类的私有方法

class Animal
   def antest
     haha = Person.new("haha",20,"male")
     haha.test2                            #给定一个外部方法访问的接口,通过这个方法访问其他类中的私有实例方法,private或者protected 都可以
   end
end
Animal.new.antest
时间: 2024-10-12 21:21:45

Ruby-类的相关文章

【Ruby】Ruby 类案例

下面将创建一个名为 Customer 的 Ruby 类,声明两个方法: display_details:该方法用于显示客户的详细信息. total_no_of_customers:该方法用于显示在系统中创建的客户总数量. 实例 #!/usr/bin/ruby class Customer @@no_of_customers=0 def initialize(id, name, addr) @cust_id=id @cust_name=name @cust_addr=addr end def di

雷林鹏分享:Ruby 类案例

Ruby 类案例 下面将创建一个名为 Customer 的 Ruby 类,您将声明两个方法: display_details:该方法用于显示客户的详细信息. total_no_of_customers:该方法用于显示在系统中创建的客户总数量. #!/usr/bin/ruby class Customer @@no_of_customers=0 def initialize(id, name, addr) @cust_id=id @cust_name=name @cust_addr=addr en

雷林鹏分享:Ruby 类和对象

Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到的类和对象.类是个别对象创建的蓝图.在面向对象的术语中,您的自行车是自行车类的一个实例. 以车辆为例,它包括车轮(wheels).马力(horsepower).燃油或燃气罐容量(fuel or gas tank capacity).这些属性形成了车辆(Vehicle)类的数据成员.借助这些属性您能把

Ruby类的继承

Ruby继承的语法 class DerivedClass < BaseClass #some stuff end < 为继承符号 重写(override) 的概念 有时, 我们希望子类从父类继承来的方法可以做与父类不相同的事情,这就需要在子类中重写方法.例如, 你有一个类名字叫Email继承于类Message,两个类都有send方法,但是Email类的send方法需要有邮件地址和一系列邮件协议,但是Message中的send方法并不知道这些,与其在Email类中添加send_mail方法,而从

ruby类和方法

Ruby 提供了四种类型的变量 局部变量:小写字母或_开头 实例变量:实例变量可跨越任何特定实例或对象的方法,意味着,从对象到对象的实例变量改变.实例变量前面加at符号@,紧接着变量名 类变量:类变量是可在各种不同的对象 一个类变量属于类 是类的一个特点 他们前面的符号@@跟着的类变量名 全局变量:类变量不能跨类 如果想要一个单一的变量可以跨类 需要定义一个全局变量 全局变量的前面总是用美元符号$ =end =begin Ruby 中使用new方法创建对象  对象是类的实例 =end class

Ruby类的创建与使用

Ruby是一种面向对象编程语言,这意味着它操纵的编程结构称为"对象" 先上代码, 了解类的定义与使用方式 class Computer $manufacturer = "Mango Computer, Inc." @@files = {hello: "Hello, world!"} def initialize(username, password) @username = username @password = password end de

Ruby类,模块1

类的扩展和继承 class Fixnum def dosome(str) puts str end def abs puts "覆盖了原有的方法" end end puts 1.class 1.dosome("动态添加的方法") 1.abs#覆盖原有的方法 freeze冻结对象 class Test attr_accessor :value end t=Test.new t.value=1 a="test" a.freeze #a<<

ruby 类、对象、变量

7.类Class (1)initialize 方法 ,initialize是一个特殊方法,默认为私有,在调用new创建一个 新对象时,Ruby首先分配一些内存来保存未初始化的对象,然后调用对象的 initialize方法, (2)inspect方法 默认将对象的ID和实例变量格式化 (3)Ruby的类永远都不是封闭的,意味着可以向一个已有的类中添加方法,包括内 建类 (4)Ruby的类允许继承,如class Child < Parent (5)继承与Mixins Ruby支持单继承,但可以从任何

【Ruby on Rails 学习六】Ruby 类 的入门

1.什么是类 2.类与实例的区别 3.自定义简单的类 生活中的垃圾分类,是集合上的概念 比如数学上的   1  a  2  b  c  4  5分类为数字1 2 4 5 ,字母  a  b  c irb(main):001:0> "abc".class => String irb(main):002:0> String => String irb(main):003:0> String.class => Class irb(main):004:0&g

Ruby 类的创建

class Language  def initialize(name, creator) @name = name @creator = creator end def description puts "I'm #{@name} and I was created by #{@creator}!" endend ruby = Language.new("Ruby", "Yukihiro Matsumoto")python = Language