ruby中的作用域和代码块

ruby中没有嵌套的作用域,它的作用域之间是分开的,一旦进入一个新作用域,原先的绑定就会被替换为一组新的绑定。

作用域门

一般来说,程序会在三个地方关闭前一个作用域,同时找开一个新的作用域。

它们分别是:class、module、def,它们被称为作用域门。class/module与def还有一点微妙的差别。在类或module中的代码会被立即执行。相反,方法中的代码只有在方法被调用的时候才执行。

扁平化作用域

my_var = "abc"

class MyClass

  def my_method

  end

end

怎么样在类MyClass中和方法my_method中使用my_var?

答案是这样的类无法使用my_var,只能改变类和方法的定义方式。下面来做这件事情:

my_var = "abc"

MyClass = Class.new do

  puts my_var #这里可以使用了

  define_method :my_method do

    puts my_var #这里可以使用了

  end

end

共享作用域:

假设想在一组方法之间共享一个变量,这个变量又不想被别的方法访问,就可以把这些方法定义在一个扁平作用域中:

def define_methods

  shared = "abc"

  Kernel.send :define_method, :my_method1 do

    puts shared

  end

  Kernel.send :define_method, :my_method2 do

    puts shared

  end

end

instance_eval(): 打开接收者。

代码块

从底层看,使用块需要分两步:1、打包备用,2、调用块(yield)来执行代码。

在ruby中绝大多数都是对象,但是块不是。要存储一个块,你需要一个对象。Proc类可以做到。这个类提供了两个内核方法用于把块转化为对象:lambda()和proc(),还有两种方法也能做到:Proc.new()和&操作符。

lambda()和proc()大多数情况下可以通用。但有些区别:

  1、在lambda中return仅仅从这个lambda中返回,在proc中return是从定义proc的作用域中返回。

  2、参数数量:lambda中如果参数数量不对,会失败,抛出一个ArgumentError的错误。而proc会把传来的参数调整为自己期望的参数形式。

时间: 2024-10-21 09:55:18

ruby中的作用域和代码块的相关文章

ruby中的作用域

作用域(scope)指的是变量的可达性或可见性.不同类型的变量有不同的作用域规则.与self类似,作用域在程序的执行过程中也在不断的变化,也可以根据上下文推断出"谁在什么作用域中".但是,self和作用域不是同一个东西,在self没有变化的时候,可以开始一个新的局部作用域,有时候,作用域和self一起改变. 全局作用域和全局变量:全局变量最不常用,但需要了解.全局变量用$开始,在整个程序的任何位置都可以访问,穿过所有的边界. 局部作用域:在任意时刻,程序都处在一个特定的局部作用域中.两

java中成员变量、代码块、构造函数执行顺序

1.java虚拟机运行程序,首先需要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量 再load子类.初始化子类静态代码块和成员变量 2.load完毕父类与子类后,从main函数入口执行程序,先输出,接着new实例化Beetle类,则先实例化父类Insect,实例化父类时,先初始化非静态成员变量和非静态代码块,接着执行父类构造方法 再实例化子类,实例化子类时,先初始化非静态成员变量和非静态代码块,接着执行子类构造方法. package it.xiangnan.test; public

理解Ruby中的作用域

作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够,但在你看看完我的这篇文章后,相信你不会再担心会遇到这些头疼的问题. 什么是作用域? 当谈论到作用域的时候,应该马上想到变量和可见性这两个词,变量和可见性是作用域的主要内容,没错,作用域就是关于在代码的什么地方什么变量是可见的,当你充分了解了作用域后,给你一段代码,你可以轻易知道此时什么变量是可见的,

Java中的4种代码块

一.普通代码块 直接在一个方法中出现的{}就称为普通代码块,例子程序如下: public class CodeDemo01{ public static void main(String[] args){ //普通代码块 { int x = 10; System.out.println("x=" + x); } int x = 100; System.out.println("x=" + x); } } 二.构造代码块 直接在类中定义的没有加static关键字的代码

java中的四种代码块

一.普通代码块 直接在一个方法中出现的{}就称为普通代码块,例子程序如下: public class CodeDemo01{ public static void main(String[] args){ //普通代码块 { int x = 10; System.out.println("x=" + x); } int x = 100; System.out.println("x=" + x); } } 二.构造代码块 直接在类中定义的没有加static关键字的代码

IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较

//代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtton点击监控事件方法-(void)event{};视图的跳转就在这个方法中实现(注意:这个button不在视图控制器里面,就算导了相关头文件,也不能跳转,所以只能通过代理方法,或者代码块等,在这个button(在自定义控件空,非视图控制器)方法中调用相关方法,在视图控制器中去实现) 代理实现方法: 在

掌握java中的三种代码块的定义及使用

代码块概念 代码块本身并不是一个很难理解的概念,实际上之前也一直在使用.所谓代码块是指使用"{}"括起来的一段代码,根据位置不同,代码块可以分为四种:普通代码块.构造块.静态代码块.同步代码块,其中同步代码块本书将在多线程部分进行讲解,本章先来观察其他三种代码块. 普通代码块 直接定义在方法中的代码块称为普通代码块. public class CodeDemo01{ public static void main(String args[]){ {  // 普通代码块 int x =

java中静态代码块(static{...}),局部代码块(方法中{...}),构造代码块(类中{...})区别。

1.局部代码块: 格式:在方法中{局部代码块执行语句} 局部代码块,又叫普通代码块.它是作用在方法中的代码块. 作用:是控制变量的生命周期. 在程序中当我们定义完成一个局部变量x之后,并且在接下来的代码中,不想再用到它时,那么就没必要让x在内存中继续占用空间.因此就有了局部代码块. 2.构造代码块: 格式:在类中{构造代码块执行语句} 作用:就是给所有对象进行初始化. 注意几点: 1)每次创建对象他都会执行. 2)构造代码快是优于构造函数执行. 3)构造代码块与构造函数的区别是:构造代码块是给所

java中成员变量、代码块、构造函数运行顺序

1.java虚拟机执行程序,首先须要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量 再load子类. 初始化子类静态代码块和成员变量 2.load完成父类与子类后,从main函数入口运行程序.先输出,接着new实例化Beetle类,则先实例化父类Insect,实例化父类时.先初始化非静态成员变量和非静态代码块,接着运行父类构造方法 再实例化子类,实例化子类时,先初始化非静态成员变量和非静态代码块,接着运行子类构造方法. package it.xiangnan.test; publi