ruby 类和模块

Ruby 类和对象

Ruby 是一种完美的面向对象编程语言。面向对象编程语言的特性包括:

  • 数据封装
  • 数据抽象
  • 多态性
  • 继承

在 Ruby 中定义类

为了使用 Ruby 实现面向对象编程,您需要先学习如何在 Ruby 中创建对象和类。

在 Ruby 中,类总是以关键字 class 开始,后跟类的名称。类名的首字母应该大写。类 Customer 如下所示:

class Customer
end

您可以使用关键字 end 终止一个类。 中的所有数据成员都是介于类定义和 end 关键字之间。



Ruby 类中的变量

Ruby 提供了四种类型的变量:

  • 局部变量:局部变量是在方法中定义的变量。局部变量在方法外是不可用的。在后续的章节中,您将看到有关方法的更多细节。局部变量以小写字母或 _ 开始。
  • 实例变量:实例变量可以跨任何特定的实例或对象中的方法使用。这意味着,实例变量可以从对象到对象的改变。实例变量在变量名之前放置符号(@)。
  • 类变量:类变量可以跨不同的对象使用。类变量属于类,且是类的一个属性。类变量在变量名之前放置符号(@@)。
  • 全局变量:类变量不能跨类使用。如果您想要有一个可以跨类使用的变量,您需要定义全局变量。全局变量总是以美元符号($)开始。

实例

使用类变量 @@no_of_customers,您可以判断被创建的对象数量,这样可以确定客户数量。

class Customer
   @@no_of_customers=0
end

在 Ruby 中使用 new 方法创建对象

对象是类的实例。现在您将学习如何在 Ruby 中创建类的对象。在 Ruby 中,您可以使用类的方法 new 创建对象。

方法 new 是一种独特的方法,在 Ruby 库中预定义。new 方法属于方法。

下面的实例创建了类 Customer 的两个对象 cust1 和 cust2:

cust1 = Customer. new
cust2 = Customer. new

在这里,cust1 和 cust2 是两个对象的名称。对象名称后跟着等号(=),等号后跟着类名,然后是点运算符和关键字 new

自定义方法来创建 Ruby 对象

您可以给方法 new 传递参数,这些参数可用于初始化类变量。

当您想要声明带参数的 new 方法时,您需要在创建类的同时声明方法 initialize

initialize 方法是一种特殊类型的方法,将在调用带参数的类的 new 方法时执行。

下面的实例创建了 initialize 方法:

class Customer
   @@no_of_customers=0
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
end

在本实例中,您可以声明带有 id、name、addr 作为局部变量的 initialize方法。在这里,def 和 end 用于定义 Ruby 方法 initialize。在后续的章节中,您将学习有关方法的更多细节。

在 initialize 方法中,把这些局部变量的值传给实例变量 @cust_id、@cust_name 和 @cust_addr。在这里,局部变量的值是随着 new 方法进行传递的。

现在,您可以创建对象,如下所示:

cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

Ruby 类中的成员函数

在 Ruby 中,函数被称为方法。中的每个方法是以关键字 def 开始,后跟方法名。

方法名总是以小写字母开头。在 Ruby 中,您可以使用关键字 end 来结束一个方法。

下面的实例定义了一个 Ruby 方法:

class Sample
   def function
      statement 1
      statement 2
   end
end

在这里,statement 1 和 statement 2 是类 Sample 内的方法 function 的主体的组成部分。这些语句可以是任何有效的 Ruby 语句。例如,我们可以使用方法 puts 来输出 Hello Ruby,如下所示:

class Sample
   def hello
      puts "Hello Ruby!"
   end
end

下面的实例将创建类 Sample 的一个对象,并调用 hello 方法:

#!/usr/bin/ruby

class Sample
   def hello
      puts "Hello Ruby!"
   end
end

# 使用上面的类来创建对象
object = Sample. new
object.hello

这将会产生下面的结果:

Hello Ruby!

Ruby 模块(Module)

模块(Module)是一种把方法、类和常量组合在一起的方式。模块(Module)为您提供了两大好处。

  • 模块提供了一个命名空间和避免名字冲突。
  • 模块实现了 mixin 装置。

模块(Module)定义了一个命名空间,相当于一个沙箱,在里边您的方法和常量不会与其他地方的方法常量冲突。

语法

module Identifier
   statement1
   statement2
   ...........
end

模块常量命名与类常量命名类似,以大写字母开头。方法定义看起来也相似:模块方法定义与类方法定义类似。

通过类方法,您可以在类方法名称前面放置模块名称和一个点号来调用模块方法,您可以使用模块名称和两个冒号来引用一个常量。



Ruby require 语句

require 语句类似于 C 和 C++ 中的 include 语句以及 Java 中的 import 语句。如果一个第三方的程序想要使用任何已定义的模块,则可以简单地使用 Ruby require 语句来加载模块文件:

语法

require filename

在这里,文件扩展名 .rb 不是必需的。

实例

$LOAD_PATH << '.'

require 'trig.rb'
require 'moral'

y = Trig.sin(Trig::PI/4)
wrongdoing = Moral.sin(Moral::VERY_BAD)

在这里,我们使用 $LOAD_PATH << '.' 让 Ruby 知道必须在当前目录中搜索被引用的文件。如果您不想使用 $LOAD_PATH,那么您可以使用 require_relative 来从一个相对目录引用文件。

注意:在这里,文件包含相同的函数名称。所以,这会在引用调用程序时导致代码模糊,但是模块避免了这种代码模糊,而且我们可以使用模块的名称调用适当的函数。



Ruby include 语句

您可以在类中嵌入模块。为了在类中嵌入模块,您可以在类中使用 include 语句:

语法

include modulename

如果模块是定义在一个单独的文件中,那么在嵌入模块之前使用 require 语句引用该文件时必需的。

Ruby 中的 Mixins

在阅读本节之前,您需要初步了解面向对象的概念。

当一个类可以从多个父类继承类的特性时,该类显示为多重继承。

Ruby 不直接支持多重继承,但是 Ruby 的模块(Module)有另一个神奇的功能。它几乎消除了多重继承的需要,提供了一种名为mixin 的装置。

Mixins 向您提供了一种完美的为类添加功能的控制方式。但是,它们真正的强大在于当 mixin 中的代码开始与使用它的类中的代码交互时。

让我们看看下面的示例代码,深入了解 mixin:

module A
   def a1
   end
   def a2
   end
end
module B
   def b1
   end
   def b2
   end
end

class Sample
include A
include B
   def s1
   end
end

samp=Sample.new
samp.a1
samp.a2
samp.b1
samp.b2
samp.s1

模块 A 由方法 a1 和 a2 组成。模块 B 由方法 b1 和 b2 组成。类 Sample 包含了模块 A 和 B。类 Sample 可以访问所有四个方法,即 a1、a2、b1 和 b2。因此,您可以看到类 Sample 继承了两个模块。因此,您可以说类 Sample 显示了多重继承或 mixin 



访问module中数据

module M
Name="模块常量"
def say()
puts "this is inside func"
end

def M.say1()
puts "this can called directly"
end
end

M::Name  # ok
M::say    #wrong  [ only when adding --> module_function :say ]
M::say1 #ok

访问class中数据

class C
include M
end
c=C.new
c::Name # ok
c.say # ok
c.say1 # wrong



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值