`

Scope- ruby中变量的作用范围

阅读更多

ruby中变量的作用范围有3种

 

1. Class definitions

2. Modle definitions

3. Method

 

当程序从一个class,或者module,或者method进入(退出)时,作用域就会改变,对应的3个关键字为:class module,和 def, 每一个关键字的位置就是作用域的入口。

 

 

Ruby代码  收藏代码
  1. v1 = 1                       #top-level scope  
  2.   
  3. class MyClass            #enter class scope  
  4.   v2 = 2  
  5.   puts local_variables  
  6.   def fun                     #enter method scope  
  7.     v3 = 3  
  8.    puts local_variables  
  9.   end  
  10.   puts local_variables  
  11. end  
  12.   
  13. a = MyClass.new  
  14. a.fun  
  15. a.fun  
  16. puts local_variables  

这段程序中有4个作用域,  顶层的作用域, 进入class时的作用域, 和两次调用fun时的作用域

 

 class和module的作用域于method的不同,当定义class或者module时,其中的代码会立即执行,也就是作用域会立即形成,而method的作用域是再真正调用时才会形成。

 

当程序从一个作用域跳到另一个作用域时,本地变量就会超出作用域,那么如何让一个变量进入到两个不用的作用域呢?

 

 

Ruby代码  收藏代码
  1. my_var = "Success"  
  2.   
  3. class MyClass1  
  4.   puts "#{my_var} in the class definition"  
  5.   
  6.   def my_method  
  7.     puts "#{my_var} in the method definition"  
  8.   end  
  9. end  

 

这段程序中,想让变量同时作用于class和method,显然,从顶层的作用域到关键字class时,作用域会发生改变,所以在class中 puts "#{my_var} in the class definition" 会抛出异常,undefined local variable or method `my_var', 同样,在方法my_method中也会抛出异常。

 

作用域的改变是再遇到关键字:class ,module,或者 method 时,所以要想让变量能够被使用,就要避免作用域的改变,也就是说,使用其他方法替换掉 class 和 method

 

 

Ruby代码  收藏代码
  1. MyClass1 = Class.new do  
  2.   puts "#{my_var} in the class definition"  
  3.   my_var = ""  
  4.   
  5.   define_method :my_method do  
  6.     puts "#{my_var} in the method definition"  
  7.   end  
  8. end  
  9.   
  10. MyClass1.new.my_method  

 

这种从在一个作用域中使用另一个作用域中的变量,称之为:flatten the scope 简称: Flat Scope

 

那么,现在假设你想在几个方法中共享一个变量,而不想让其他人来访问这些变量,你就可以这样写:

 

 

Ruby代码  收藏代码
  1. def define_methods  
  2.   shared = 0  
  3.   
  4.   Kernel.send :define_method:counter do  
  5.     shared  
  6.     puts shared  
  7.   end  
  8.   
  9.   Kernel.send :define_method:inc do |x|  
  10.     shared += x  
  11.     puts shared  
  12.   end  
  13. end  
  14.   
  15. define_methods  
  16. counter  
  17. inc(4)  
  18. counter  

 

输出结果为:

 

 

0

4

4

 

这种称之为: Shared Scope

1
0
分享到:
评论

相关推荐

    Programming-univbasics-3-methods-scope-lab-online-web-prework

    方法范围实验室学习目标定义局部变量定义方法定义一个带有参数的方法介绍我们将构建一个标语生成器,以从一些流行的视频游戏中输出标语。 让我们利用我们的方法,范围和变量知识!定义局部变量打开lib/catch_phrases...

    method-scope-lab-online-web-sp-000

    方法范围实验室目标定义一个接受参数并传递变量作为该参数的方法。了解在方法内部定义的变量不能在该方法外部使用。指示第一部分:将变量传递给方法打开lib/catch_phrase.rb 。您应该看到以下方法: def catch_...

    ruby for rails

    4. **The default object (self) and scope**:Ruby中的`self`关键字,它如何指示方法调用的目标对象,以及作用域规则,包括局部作用域、实例作用域和类作用域。 5. **Control flow techniques**:控制流程的技巧,...

    jekyll-config-variables:一个 Jekyll 猴子补丁,允许你在 _config.yml 文件中使用变量

    jekyll-verison-helper 这个 gem 允许您在_config.yml文件中定义变量并通过同一文件引用它。 为此,首先,创建一个名为variables的键,并使用您喜欢的任何一组变量名填充它: variables : latest_version : " 2.0 " ...

    张文钿 Rails Best Practices 幻灯片

    - **将查询移动到命名范围(named_scope)**:将复杂的查询逻辑从控制器移动到模型中,利用`named_scope`进行封装,提高代码的可读性和可维护性。 - **使用模型关联**:利用模型之间的关联关系来减少不必要的查询,...

    [IronRuby] C# 4.0调用ActiveRecord

    1. 第一级是脚本运行时(Script Runtime),作用域(Scope),以及执行文件和代码片段。 2. 第二级关注于引擎(Engine),编译代码,源代码和对象操作。 3. 第三级提供了完整控制,远程调用,工具支持等更高级的功能...

    JavaScript 手册

    Node.js的兴起将JavaScript语言的应用范围拓宽到传统后端语言如Java、Ruby、Python、PHP等曾经的领地。 紧接着,手册概述了ECMAScript标准,这是JavaScript的核心标准,保证了不同环境中的JavaScript代码能够具有...

    Maven权威指南 很精典的学习教程,比ANT更好用

    Including and Excluding Dependencies by Scope 12.5.4.4. Fine Tuning: Dependency Includes and Excludes 12.5.4.5. Transitive Dependencies, Project Attachments, and Project Artifacts 12.5.4.6. ...

    rails国际化

    4. **动态翻译**:Rails还支持动态插入变量到翻译字符串中,如`t('user.welcome', name: 'John')`,这将在翻译中插入`name`变量的值。 5. **时间、日期和数字格式化**:Rails的i18n库也处理日期、时间、数字的本地...

    The Rails 4 Way, 3rd edition.pdf

    《Rails 4 的方式》是一本针对Ruby on Rails 4框架的深入指南,旨在帮助开发者更好地理解并应用Rails 4的各项功能和技术。本书由Obie Fernandez、Kevin Faustino 和 Vitaly Kushner共同撰写,于2014年6月3日发布。...

    Hometask_6_Closures

    在编程中,闭包是一种强大的工具,尤其在函数式编程语言中,它允许函数访问并操作其外部作用域的变量,即使在其定义的上下文之外。闭包在JavaScript、Python、Ruby等多门编程语言中都有应用。 闭包的核心在于它可以...

    angularjs结合html5实现拖拽功能

    AngularJS是一种流行的JavaScript框架,它允许开发者使用HTML作为模板语言,...通过创建控制器、定义作用域变量和函数、编写自定义指令,并在HTML模板中正确地应用这些指令,就可以实现具有复杂交互逻辑的拖拽功能。

    Rails Best Practices

    Rails,全称Ruby on Rails,是一个基于Ruby语言的开源Web应用程序框架,遵循MVC(模型-视图-控制器)架构模式。它以其简洁、高效和开发速度闻名,深受开发者喜爱。Rails最佳实践是提升代码质量和可维护性的关键,...

    active_rails_examples

    例如,`scope :active, -> { where(active: true) }`创建了一个返回所有活动用户的范围。 在“active_rails_examples-main”目录中,你可能会找到这些概念的实现,通过实际代码来展示它们是如何工作的。这些示例...

    Jade_coffee_sass_angular

    CoffeeScript是一种简洁、优雅的JavaScript预处理器,它的语法更接近Ruby或Python,旨在提高JavaScript的可读性和可写性。例如,下面的CoffeeScript代码: ```coffeescript name = "张三" console.log "欢迎#{name}!...

Global site tag (gtag.js) - Google Analytics