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)
时间: 2024-11-09 07:25:49

Ruby基础类型,动态特性,代码块的相关文章

ruby中的作用域和代码块

ruby中没有嵌套的作用域,它的作用域之间是分开的,一旦进入一个新作用域,原先的绑定就会被替换为一组新的绑定. 作用域门 一般来说,程序会在三个地方关闭前一个作用域,同时找开一个新的作用域. 它们分别是:class.module.def,它们被称为作用域门.class/module与def还有一点微妙的差别.在类或module中的代码会被立即执行.相反,方法中的代码只有在方法被调用的时候才执行. 扁平化作用域 my_var = "abc" class MyClass def my_me

面向对象基础——static关键字和代码块的使用

具体内容 在Java中可以使用static声明属性和方法,因为之前多部分属性和方法都属于非static的,这样一来,每个对象都占有自己的内容,如果现在希望一个属性被所有的对象所共同拥有,则可以将其声明为static类型,声明为static类型的属性和方法之后此属性或方法也称为类非,可以由类名称直接调用. 使用static声明属性 static可以声明全局属性,全局属性到底有哪些作用?如下所示 class Person{ // 定义Person类 String name ; // 定义name属性

java基础复习一、代码块执行顺序

1 /** 2 * 代码块执行顺序的测试 3 * 执行顺序 静态代码块>main代码块>构造代码块>构造函数>普通代码块 4 * @author Administrator 5 * 6 */ 7 public class ClassDemo01 { 8 static { 9 System.out.println("这是一个静态代码块"); 10 } 11 { 12 System.out.println("这是一个构造代码块"); 13 } 1

Java基础(9) - 静态、代码块

关键字加载顺序 .类初始化 .方法区.进程 存在作用:变量 -> 全局共享 (跨线程,但不支持跨进程)方法 -> 不用类实例就能直接使用,避免New的消耗.(为什么静态方法不能访问非静态变量)代码块 -> 静态块在类初始化就运行 ,初始化顺序 静态代码块 -> 普通代码块 -> 构造方法 -> 普通方法,代码块只会初始化一次导包 -> 静态导包,将类的方法直接导入到当前类中,从而直接使用"方法名"即可调用类方法,更加方便. 类加载:? 静态属性

Ruby 中的闭包-代码块

看了一片文章https://ruby-china.org/topics/38385讲closure的. 写下一些感想: 闭包就是 一个函数能够记住和存取它的lexical作用域,即使这个函数是在它的lexical作用域的外面执行. 当一个函数被写出来时,这个函数的closure就已经确定了. javascript中有闭包的概念:https://www.cnblogs.com/chentianwei/p/9739714.html Ruby中的关键字定义def是没有闭包的.它创建一个封闭的作用域.

java代码块的理解

最近在复习java基础,在看到java代码块的时候,忽然发现自己貌似对于java代码块一无所知,于是赶紧对着一些资料实战演练了一把. 对于java代码块,不难根据名称看出其实就是一些java语句的集合,以{}的形式出现,共有4中形式: 1.类的方法体 这是我们最常见的一种java代码块,形式如下: 1 public class Boke { 2 public void say(){ 3 System.out.println("我就是代码块的内容啦"); 4 } 5 } say的方法体{

JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常

在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常.如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度.下面用一个例子来理解. Java 7之前的版本: 1 2 3 4 5 6 7 8 9 10 catch (IOException ex) {      logger.error(ex);      throw new MyException(ex.getMessage()); catch (SQLException ex) {      

JavaSE8基础 在构造代码块中给final类型的成员变量赋值

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: /* * final 修饰值类型的成员变量. */ class Demo { final int num; { num = 1;//在构造代码块中给final类型变量赋值 //num = 2; 但是 不能重复赋值.比如,在num=1后面加上num=2,就会报错! } public static void ma

Oracle实践--PL/SQL基础之代码块

PL/SQL基础入门之代码块 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. 优点: 1.       支持SQL,可以使用:DML,DCL,游标控制和SQL运算符 2