当前位置:首页 > 开发 > 编程语言 > Ruby > 正文

ruby语法二

发表于: 2010-06-04   作者:酷的飞上天空   来源:转载   浏览:
摘要:   ruby中的模块(require,load,include,extend) 模块是ruby组织代码的方式,提供命名空间的支持,类似于java中的包,但其功能更复杂一些 模块例子: module MyModule #为了可以直接调用所有使用了类方法的定义 def self.module_function puts "模块方法module_fun
 

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语法二

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
railsapi:http://www.railsbrain.com/ 1.实用的tab (tab.zip) 这里圆角就是用的css3实现的 -moz-bor
Ruby语言的主要特色 编程语言总有相同之处,因为它们的目标是一致的,但每一种语言都有自己特有的部
体验一中添加了一个最基本的支架和一个简单的数据迁移,实现了一个基本的增删改查的功能列表。体验
Ruby学习笔记 ruby使用方法 the first half of ruby we are defining, we are creating 例如 blue_c
已经配置好Ruby on Rails 的开发环境了,现在开始来写地一个Ruby on Rails项目——输出Hello Ruby o
标识符问题。 1、不能用数字开头 2、不能使用关键字 不能使用关键字很明显是因为禁用,而数字是因为
// Playground - noun: a place where people can play import Cocoa //控制流 //Swift的条件语句包
1、工程结构 2、查询语法代码 package org.itat.index; import java.io.File; import java.io.IOExc
1.Field-Symbols FIELD-SYMBOLS是字段符号,类似于FOXPRO的宏,FOXPRO能把一段程序存入一个字符串中
利用支架创建代码 ruby script/generate scaffold Knoledge id:string userid:string title:string
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号