美文网首页
Ruby块与模块

Ruby块与模块

作者: Colleen_oh | 来源:发表于2019-11-12 14:58 被阅读0次

Ruby 块

Ruby 有一个块的概念。
块由大量的代码组成。您需要给块取个名称。块中的代码总是包含在大括号 {} 内。块总是从与其具有相同名称的函数调用。这意味着如果您的块名称为 test,那么您要使用函数 test 来调用这个块。
您可以使用 yield 语句来调用块。

yield 语句

直接上例子:

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
def test
   puts "在 test 方法内"
   yield
   puts "你又回到了 test 方法内"
   yield
end
test {puts "你在块内"}

结果如下:

在 test 方法内
你在块内
你又回到了 test 方法内
你在块内

您也可以传递带有参数的 yield 语句。下面是一个实例:

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
def test
   yield 5
   puts "在 test 方法内"
   yield 100
end
test {|i| puts "你在块 #{i} 内"}

结果如下:

你在块 5 内
在 test 方法内
你在块 100 内

BEGIN 和 END 块

每个 Ruby 源文件可以声明当文件被加载时要运行的代码块(BEGIN 块),以及程序完成执行后要运行的代码块(END 块)。
下面来看一个例子:

#!/usr/bin/ruby
 
BEGIN { 
  # BEGIN 代码块
  puts "BEGIN 代码块"
} 
 
END { 
  # END 代码块
  puts "END 代码块"
}
  # MAIN 代码块
puts "MAIN 代码块"

一个程序可以包含多个 BEGIN 和 END 块。BEGIN 块按照它们出现的顺序执行。END 块按照它们出现的相反顺序执行。当执行时,上面的程序输出以下结果:

BEGIN 代码块
MAIN 代码块
END 代码块

Ruby 模块

模块(Module)是一种把方法、类和常量组合在一起的方式。模块(Module)为您提供了两大好处:1、模块提供了一个命名空间和避免名字冲突。2、模块实现了 mixin 装置。

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

模块类似与类,但有一些不同:1、模块不能实例化。2、模块没有子类。3、模块只能被另一个模块定义

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

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

#!/usr/bin/ruby
 
# 定义在 trig.rb 文件中的模块
 
module Trig
   PI = 3.141592654
   def Trig.sin(x)
   # ..
   end
   def Trig.cos(x)
   # ..
   end
end

Ruby require 语句

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

require filename

我们来看一个例子:

$LOAD_PATH << '.'
 
require 'moral'
 
wrongdoing = Moral.sin(Moral::VERY_BAD)

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

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

Ruby include 语句

您可以在类中嵌入模块。为了在类中嵌入模块,您可以在类中使用 include 语句.
如果模块是定义在一个单独的文件中,那么在嵌入模块之前就需要使用 require 语句引用该文件。
下面我们来看一个例子:
假设下面的模块写在 support.rb 文件中。

module Week
   FIRST_DAY = "Sunday"
   def Week.weeks_in_month
      puts "You have four weeks in a month"
   end
   def Week.weeks_in_year
      puts "You have 52 weeks in a year"
   end
end

现在,您可以在类中引用该模块,如下所示:

#!/usr/bin/ruby
$LOAD_PATH << '.'
require "support"
 
class Decade
include Week
   no_of_yrs=10
   def no_of_months
      puts Week::FIRST_DAY
      number=10*12
      puts number
   end
end
d1=Decade.new
puts Week::FIRST_DAY
Week.weeks_in_month
Week.weeks_in_year
d1.no_of_months

结果如下:

Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120

Ruby 中的 Mixins

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

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

Ruby 没有真正实现多重继承机制,而是采用成为mixin技术作为替代品。将模块include到类定义中,模块中的方法就mix进了类中。

让我们看看下面的示例代码,深入了解 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

参考:https://www.runoob.com/ruby/ruby-module.html

相关文章

  • Ruby块与模块

    Ruby 块 Ruby 有一个块的概念。块由大量的代码组成。您需要给块取个名称。块中的代码总是包含在大括号 {} ...

  • Ruby学习笔记2(方法、块、模块)

    方法 Ruby中的方法就是其他语言中的函数,名称应以小写开头,以免被解释为常量。参数可有可无,可以有默认值也可以没...

  • Ruby 模块

  • Ruby学习总结

    ruby的计算符合正常编程逻辑比如: Math是Ruby内建的数学模块。在Ruby中,模块提供了两种角色:一种角色...

  • Ruby 块

  • Ruby:块

    首先来看一下块的语法 块的调用方法一般采用以下形式: 再来看一下块的回调 1.yield yield 主要用于隐式...

  • ruby 块

    ruby块: 块中的代码总是包含在大括号{}中 块总是从与其具有相同名称的函数调用,eg:如果你的块名为test,...

  • Sass注释中文报错问题

    找到ruby的安装目录,里面也有sass模块,如这个路径: C:\Ruby\lib\ruby\gems\1.9.1...

  • Ruby 解析 json

    环境配置 在使用 Ruby 编码或解码 JSON 数据前,我们需要先安装 Ruby JSON 模块。在安装该模块前...

  • Ruby小技巧:Each with object

    Ruby Bits: Each with object Enumerable是Ruby世界的核心模块。如果熟悉了它...

网友评论

      本文标题:Ruby块与模块

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