• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ruby中的作用域和代码块

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Ruby/Rails 生态环境、社区、资料 Ecosystem发布时间:2022-07-14
下一篇:
升级ruby的版本 https://gems.ruby-china.com/发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap