ruby语法二

 

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未定义!
 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值