美文网首页
ruby中的作用域和代码块

ruby中的作用域和代码块

作者: limx | 来源:发表于2016-08-27 17:38 被阅读0次

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会把传来的参数调整为自己期望的参数形式。

相关文章

  • ruby中的作用域和代码块

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

  • 前端总结

    闭包以及应用场景 作用域作用域决定了代码区块中变量、函数、对象和其他资源的可见性全局作用域、函数作用域和块级作用域...

  • C语言——链接属性,变量作用域、存储类型

    作用域 代码块作用域 在代码块({}内)所定义的变量只有在该代码块里面的代码被访问,具有代码块作用域,如果与外层的...

  • js 变量提升和函数提升

    在js中只有两种作用域,全局作用域和函数作用域,在ES6之前,js是没有块级作用域。 JavaScript 代码的...

  • typescript笔记(二)

    一、作用域:全局作用域、局部作用域、类作用域 全局:可以在代码的任何位置使用; 局部:只能在声明它的代码块中; 类...

  • C语言基础掌握之day5

    内存管理 作用域 一个C语言变量的作用域可以是代码块作用域,函数作用域或者文件作用域。代码块是{}之间的一段代码。...

  • 作用域、二义性和extern

    一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域。代码块是{}之间的一段代码。 总结

  • 【C语言】内存管理-008

    第八章 内存管理 8.1 作用域 C语言变量的作用域分为: 代码块作用域(代码块是{}之间的一段代码) 函数作用域...

  • 3-6 作用域和闭包--作用域-代码演示

    3-6 作用域和闭包--作用域-代码演示 知识点1、块级作用域

  • js高级知识点(第五天)

    所用域 什么是作用域 变量起作用的范围 什么是块级作用域,使用代码块限定的作用域是块级作用域(let声明的变量是块...

网友评论

      本文标题:ruby中的作用域和代码块

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