今天没事看blog的时候,看到一个小子实现了这个,不过他的程序写的那叫一个丑陋,实在是看不下去,就自己写了个.
原理很简单,那就是首先将要检测的方法重命名掉,然后动态定义一个相同的,这时他就会调用我们定义的这个方法,这时我们就可以检测参数的类型的,检测如果成功,在最后调用我们刚才重命名过的那个方法:
class Object
class << self
def check_type method_name,*arg_type
raise ArgumentError, "method_name is missing" unless new.respond_to?(method_name)
arg_count=new.method(method_name).arity
alias_method :"old_#{method_name}",method_name
define_method(method_name) do |*args|
raise ArgumentError,"wrong number of arguments(#{args.length} of #{arg_count})" if arg_count>=0 and arg_count!=args.length
message=""
args.each_with_index do |item,index|
break if arg_type[index]==nil
message << "argument type is wrong(#{item.class} of #{arg_type[index]}" if item.class!=arg_type[index]
end
raise ArgumentError,message unless message==""
send(:"old_#{method_name}",*args)
end
end
end
end
class Test
def bar(x,y,z)
p [x,y,z]
end
check_type :bar,String
end
Test.new.bar(1,2,5)
Test.new.bar("a",1,2)
分享到:
相关推荐
我们在用python进行程序开发的时候,很多时候我们需要检测一下当前的变量的数据类型。比如需要在使用字符串操作函数之前先检测一下当前变量是否是字符串。下面小编给大家分享一下在python中如何检测数据类型 首先...
3.4 在生成的程序集中引用一个强命名程序集 3.5 强命名程序集能防范篡改 3.6 延迟签名 3.7 私有部署强命名程序集 3.8 “运行时”如何解析类型引用 3.9 高级管理控制(配置) 3.9.1 发布者策略控制 第4章 类 型...
虽然在前面各章的程序中都只有一个主函数main(), 但实用程序往往由多个函数组成。函数是C源程序的基本模块, 通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。 C语言不仅提供了...
(3)货物在运输前、运输时和运输后,都需要检查和记录,因此,需要定义 3 个方法。 送货前的准备方法: sendBefore(), 无参, 输出文字信息, 以及货物重量、 快递单号等信息。输出如下图所示。 发送货物方法:...
9.1定义一个代参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。 66 9.2输入两个整数,求它们相除的余数。用带参的宏来实现,编程序。 67 9.3 67 9.4给年份year定义...
2.2 解释第一个程序 2.3 显示变量的值 2.4 小结 2.5 练习 第3章 类、对象和方法 3.1 到底什么是对象 3.2 实例和方法 3.3 用于处理分数的Objective-C类 3.4 @interface部分 3.4.1 选择名称 3.4.2 实例变量 3.4.3 类...
1、微信小程序错误状态码(例如:401)的获取 当小程序请求后端接口时...fail回调一般源于在url格式、参数类型检查、网络连接、域名解析、response编码问题等 2、日期选择器的起始时间极限值 <picker class="infor
2.4 怎样表示一个算法 24 2.4.1 用自然语言表示算法 24 2.4.2 用流程图表示算法 24 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 ...
子程序 开始动画, , 公开, 必须先保存源,在绘制下一个图形之前保存 .参数 帧数, 整数型, 可空, 默认15 .参数 间隔, 整数型, 可空, 默认15 .子程序 可视, 逻辑型, 公开, 48 .参数 是否可视, 逻辑型, 可空 .子程序 ...
2.4 怎样表示一个算法 24 2.4.1 用自然语言表示算法 24 2.4.2 用流程图表示算法 24 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 ...
2.4 怎样表示一个算法 24 2.4.1 用自然语言表示算法 24 2.4.2 用流程图表示算法 24 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 ...
2.4 怎样表示一个算法 24 2.4.1 用自然语言表示算法 24 2.4.2 用流程图表示算法 24 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 ...
C++是一个更好的C,它保持了C的简洁、高效、接近汇编语言、具有良好的可读性和可移植性等特点,对C的类型系统进行了改革和扩充,因此C++比C更安全,C++的编译系统能检查出更多的类型错误。 C++语言最重要的特点是...
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)...
■ 新增一个方法 changePassword ,只有旧密码正确,新密码符合要求,且两次输入相 同的情况下才可以成功修改密码 设计测试类 ATMMachine2,其主菜单如下(可参考教材中文版 P296或英文版 P367): Main menu ...
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)的...
2.4 怎样表示一个算法 4 2.4.1 用自然语言表示算法 4 2.4.2 用流程图表示算法 4 2.4.3 三种基本结构和改进的流程图 8 2.4.4 用N-S流程图表示算法 9 2.4.5 用伪代码表示算法 10 2.4.6 用计算机语言表示算法 11 2.5 ...
JavaTMservlets是一个不受平台约束的Java小程序,它可以被用来通过多种方法扩充一个Web服务器的功能。你可以把Servlet理解成Server上的applets,它被编译成字节码,这样它就可以被动态地载入并用效地扩展主机的处理...
说明: 指定一个字符串值, 设置 TIME 数据类型的默认值, 该数据类型包含 HOUR, MINUTE 和 SECOND 这几个日期时间字段。 语法: TIME '09:26:50' (将值存储为 7 个字节)。 默认值: 从 NLS_TERRITORY 中获得 nls_time...