ruby中的模块(require,load,include,extend)
模块是ruby组织代码的方式,提供命名空间的支持,类似于java中的包,但其功能更复杂一些
模块例子:
module MyModule
#为了可以直接调用所有使用了类方法的定义
def self.module_function
puts "模块方法module_function"
end
end
module MyModule
CONST = "模块中的常量"
module MySubModule
CONST = "子模块中的常量"
end
end
MyModule.module_function
#或者MyModule::module_function也可以调用模块中的方法
puts MyModule::CONST
puts MyModule::MySubModule::CONST
创建好模块后,下一步就是在其他的地方加载或者混入模块。ruby中有4个方法可以实现这些功能require,load,include,extend
require和load的功能是加载相应的模块文件到当前环境中。load不管之前是否已经加载过而直接包含源代码文件。require则进行检查,保证只加载一次。
用法如下
load 'yaml.rb'
require 'yaml'
include和extend的作用是将模块混入或者扩展已有的模块或者类
用法如下
module MyModule
def module_method
puts "module_method"
end
end
class MyClass1
include MyModule
end
class MyClass2
#相当于self.extend MyModule
extend MyModule
end
myclass1 = MyClass1.new
#类中使用include,模块中的方法变成了实例方法
myclass1.module_method
#类中使用extend,模块中的方法变成了类方法
MyClass2.module_method
ss="aaa"
#所有对象都可以extend模块而获得模块中的方法,因为extend属于Object中的方法
ss.extend(MyModule)
ss.module_method
#总结:在类中extned模块则模块中的方法变为类方法,在对象上extend模块则模块中的方法成为实例方法
动态特性
ruby的动态特性体现在以下几个方面
1.动态执行字符串的代码
2.动态获得模块或类中的常量和变量值
3.动态为类或对象添加方法
4.对未知变量和方法的动态处理
5.动态删除定义
动态调用对象的方法
"abcd".upcase #返回ABCD
my_method = "upcase"
puts "abcd".send(my_method) #输出ABCD
my_method = "downcase"
puts "ABCD".send(my_method) #输出abcd
动态获得模块或类中的方法,常量,变量值
#methods是Object中的方法,他返回对象所包含所有的公开方法名称。结果为一个数组
puts String.methods.length
#同理instance_methods返回的是所有的实例方法
puts String.instance_methods.length
#method_defined?用来检查是否对象定义了相应的方法
puts String.method_defined? "reverse"
#respond_to?用了检查类是否能够响应某实例方法的调用
puts "sss".respond_to? "upcase"
#根据常量的名称获得模块或类中常量的值
name = "PI"
puts Math.const_get(name)
#根据类的名称创建类的实例
class_name = "Array"
my_array = Object.const_get(class_name)
#输出数组的长度
puts my_array.new.length
动态定义方法
class MyClass
def self.new_method(name,&block)
#调用module的私有方法define_method
define_method(name, &block)
end
end
MyClass.new_method("my_new_method") {puts "这是动态定义的方法"}
my_class = MyClass.new
my_class.my_new_method
调用未知方法的处理
method_missing介绍,当调用的方法不存在时执行
class MyClass
def method_missing(name)
puts "方法#{name}尚未定义!"
end
end
MyClass.new.unknown_method
#输出 方法#{name}尚未定义!
动态删除方法
取消定义方法的关键字是undef。module类中还提供了remove_method,undef_method,remove_const方法。其中remove_method只能删除当前的方法定义,而undef_method则连带父类的方法定义一并删除
例子:
def test_function
puts "test_function"
end
#取消方法的定义
undef test_function
class MyClass
def method1
puts "method1"
end
def method2
puts "method2"
end
end
#继承类MyClass
class MySubClass<MyClass
#当调用的方法不存在是被调用
def method_missing(name)
puts "方法#{name}未定义!"
end
def method1
puts "submethod1"
end
def method2
puts "submethod2"
end
#移除当前类的method1方法的定义
remove_method("method1")
#取消方法method2的定义,包括父类中的定义
undef_method("method2")
end
sub_class = MySubClass.new
sub_class.method1 #输出method1
sub_class.method2 #输出方法method2未定义!
分享到:
相关推荐
下面是对Ruby语法的详细解析: 1. 变量与常量 - 局部变量:以小写字母或下划线开头,如`var`或`_var`。 - 全局变量:以美元符号`$`开头,如`$var`。 - 类变量:在类中定义,以双`@`开头,如`@@var`。 - 实例...
这篇博文链接()可能详细解释了Ruby的基本语法和特性,但由于没有实际内容,我将根据常见的Ruby语法知识进行阐述。 1. **变量**: Ruby有四种类型的变量:局部变量(`local`)、实例变量(`instance`)、类变量(`...
### Ruby语言教程对Ruby语法的总结 #### 一、变量与数据类型 **特点:** - **动态类型:** Ruby是一种动态类型的语言,这意味着你无需为变量声明具体的数据类型。 - **变量命名规则:** 变量名必须以小写字母或...
#### 二、Ruby 语法基础 - **文件扩展名**:所有 Ruby 文件的扩展名为 `.rb`。 - **简单示例**:创建一个名为 `test.rb` 的文件,并在其中写入如下代码: ```ruby #!/usr/bin/ruby -w puts "Hello, Ruby!"; ```...
以下是一些从书中的截图中可以提炼的重要Ruby语法知识点: 1. **变量** - `local变量`:以小写字母开头,如`x = 10`。 - `实例变量`:以`@`开头,如`@name = "John"`。 - `类变量`:以`@@`开头,用于整个类共享...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本教程将深入探讨Ruby的基础语法,并介绍如何下载、安装Ruby,以及使用Ruby教程中文版进行学习。 首先,让我们从Ruby的...
### 前端学 Ruby:熟悉 Ruby 语法 #### Ruby 是什么? Ruby 是一种动态的、面向对象的脚本语言,由日本人松本行弘在 1995 年设计并开发。作为一种解释型语言,Ruby 具有简单易懂、功能强大且灵活的特点。Ruby 在 ...
Ruby是一种面向对象的编程语言,以其简洁、优雅的语法著称。这个"Ruby基础语法视频教程1"涵盖了几个关键的概念,包括变量、变量规则以及表达式。以下是对这些主题的详细解释: 1. 变量(Variables): 在Ruby中,...
### Ruby语法基础教程知识点概览 #### 一、Ruby语言概述 **1.1 Ruby的历史** - **创始人:** Ruby语言是由日本人松本行弘(Matz)在1995年开始开发的一种脚本语言。 - **发展背景:** 在Perl和Python流行的时代背景...
#### 二、Ruby 语言特性 - **面向对象**:在 Ruby 中,所有事物都是对象。这包括数字、字符串、数组、哈希表等基本数据类型以及函数和类。 - **动态类型**:Ruby 使用动态类型系统,变量可以在运行时改变其类型。 -...