Ruby基础类型,动态特性,代码块
#Ruby内置基础数据类型 NilClass,TureClass,FalseClass,Time,Date,String,Range,Struct,Array,Hash #Numerice 1.分为Interger整数类。Interger又分为Fixnum和Bignum。 #2.#Float浮点数 #3.Complex复数。 #Bury的动态特性 #1.动态执行字符串形式的代码 eval #2.动态获得模块或类中的常量和变量的值 #3.动态为类或对象添加方法 #4.对为知变量和方法的动态处理 #5.动态删除定义 #eval编译并执行字符串。javascript的eval =begin class_eval 在类的上下文范围内将字符串作为代码编译执行 module_eval 在类或者模块的上下文范围内将字符串作为代码编译执行 instance_eval 是在实例的上下文范围内编译执行 =end class String PI="fjskdjf" def dosome(n) self[0,n]+(self.size > n ? ".." : "")#空格不可忽略=_=|| end for i in [5,6,7,8] module_eval "def dosome_#{i} dosome(#{i}) end " end end puts "sdfsdf".dosome_5 puts "sdfdsfsdf".dosome_6 puts "gsfsdf".upcase puts "sdfsdf".send("upcase")#send方法动态调用对象的方法 #puts "sadfd".methods #puts String.methods #获取对象的所有方法名 #instance_methods 返回所有公开的实例方法名,protected_methods返回的是受保护的方法名 puts String.method_defined?(:upcase)#检查对象是否定义了某实例方法 puts "String".respond_to?(:upcase)#检查对象是否能相映某实例方法的调用 puts String.const_get("PI")#根据常量的名称获取模块货类中常量的值 puts String::PI #const_missing,method_missing 方法,当对象调用不存在的方法或者常量的时候可以自定义返回的错误信息。 array=[1,3,4,5,22,33] array<<[1,44,5,6,7]#添加元素 array.push([333,1234,1233333])#添加元素 array.each { |item| puts item }
lambda和proc,block
def test(arg,arg2,&block) #把方法的参数处理后传递给代码块的参数 yield arg+arg2,"代码块的第二个参数"#占了两个位,所以下面调用都会输出2次,代码块其实是Proc对象 yield arg+arg2,"第二个参数"#这里的yield其实就相当与下面的作用 block.call(arg+arg2,"proc对象第二个参数") end #test(11) {puts "yield占位"} #test do # puts "今天是个好日子" #end #代码块 的两种创建方式{ 代码 } ,do 代码 end test("啥玩意儿","恩德") {|x,y| puts x+y} block=Proc.new{|o,x| puts o+x+"Proc方法"} test("啥啥","正规军",&block) #代码块的参数用|参数|传递。yield (x,y)给代码块传递参数 #使用proc方法的好处是能感觉到给方法传递了代码块参数,proc对象做方法传递是要加上&符号 def f0() p = Proc.new { return 0} p.call 1 end def f1() l = lambda { return 0} l.call 1 end f0 # 返回0 f1 # 返回1 #如果你能够理解proc在行为上更像block,lambda其实就是方法只不过是匿名的,那么你对上面的结果不会感到惊讶。 #如果把f0,f1做一些修改,就更容易理解上面的结果了。 def f0() return 0 1 end def f1() def __f1 return 0 end __f1 1 end f0 # 返回0 f1 # 返回1
异常处理
def extest(x,y) begin#try z=x/y rescue =>err#catch puts err #retry 恢复重来 ensure#finaly puts "操作完毕" end end extest(1,0)