美文网首页
Ruby的动态特性

Ruby的动态特性

作者: _西风凋碧树 | 来源:发表于2019-04-11 18:01 被阅读0次

Ruby动态特性的体现

  • 动态执行字符串形式的代码。
  • 动态获取模块或类中的常量和变量值
  • 动态为类或者对象添加方法
  • 对未知变量和方法的动态处理
  • 动态的删除定义

动态的执行代码

class String
    def truncate(n)
        self[0,n] + (self.size>n ? "..." : "..")
    end
    
    for i in [5,8,10,20]
        module_eval "
        def truncate_#{i}
            truncate #{i}
        end
        "
    end
end

puts "abcdefg".truncate(2)
puts "abcdefg".truncate_5
puts "abcdefg".truncate_10
输出:
ab...
abcde...
abcdefg..

动态获得模块或类中的方法,常量或变量值

puts String.methods # 返回所有公开的实例方法名
puts String.instance_methods  # 返回受保护的方法名
puts String.method_defined?(:reverse) # 判断是否定义了某实力方法
puts "str".respond_to?(:upcase) # 检查类是否能够响应某实例方法的调用
str = "PI"
puts Math.const_get(str)#根据常量的名称获取模块或类中常量的值
class_name = "Array"
array_class = Object.const_get(class_name) # 根据类的名称创建类实例
puts array_class.new

注意:instance_variable_get和instance_variable_set仅限于获取实例变量,如果实例中去掉@,则会报错

@aa = 1
puts self.instance_variable_get("@aa")
self.instance_variable_set("@aa",2)
puts @aa

动态定义方法

class MyClass
  def self.new_method(name,&block)
    define_method(name,&block)
  end
end
MyClass.new_method(:my_new_method){puts "这是动态定义的新方法!"}
my_class = MyClass.new
my_class.my_new_method
# &block 表示可以引用一个代码块
coust_missing、method_missing 介绍
# 自定义不存在的常数和方法提示
class Module
    def const_missing(name)
        puts "常数#{name}没有定义!"        
    end

    def method_missing(name,*args)
        puts "方法#{name}没有定义!"
    end
end

puts String.unknown_method
puts puts String::Unknown_Const

动态删除定义

remove_method 和 remove_const都是私有方法,只能在类或模块内部使用

def test_function
    puts "test_function"
end

undef test_function #删除方法定义

class MyClass
    def method1
        puts "method1"
    end

    def method2
        puts "method2"
    end
end

class MySubClass < MyClass
    def method1
        puts "method1"
    end

    def method2
        puts "method2"
    end

    remove_method :method1
    undef_method :method2
end

sub_class = MySubClass.new
sub_class.method1
sub_class.method2

相关文章

  • Ruby的动态特性

    Ruby动态特性的体现 动态执行字符串形式的代码。 动态获取模块或类中的常量和变量值 动态为类或者对象添加方法 对...

  • 基础 (十三) : KVC/KVO

    由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby、Python的动态特性,例如动态类型、...

  • 基础 (十三) : KVC/KVO

    由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby、Python的动态特性,例如动态类型、...

  • KVC总结(转)

    概述由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby、Python的动态特性,例如动态类...

  • iOS基础之KVC与KVO

    1. 概述 ObjC主要基于Smalltalk进行设计, 因此它有很多类似Ruby,Python的动态特性, 例如...

  • iOS之KVC KVO

    KVC与KVO 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby、Python的动态特性...

  • Ruby 语言进阶

    Intro to Ruby (Ruby 基础) 什么是ruby?ruby是动态的(没有固定的类型),反射性的,面向...

  • Ruby介绍与环境

    下面要开始学习Ruby啦!!! Ruby是一种纯粹的面向对象编程语言。 Ruby的特性: Ruby 是开源的,在 ...

  • Ruby or Rails 学习总结 1

    Qo_Tn 第一章 学习 1.1 Ruby ruby 特性 弱类型 语言 1.3 下载安装Ruby 和 Rai...

  • 详解Java动态代理机制

    之前介绍的反射和注解都是Java中的动态特性,还有即将介绍的动态代理也是Java中的一个动态特性。这些动态特性使得...

网友评论

      本文标题:Ruby的动态特性

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