`
sg552
  • 浏览: 619994 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
47437293-94b9-3b04-9152-8971c7580049
白手起家学习使用Flex
浏览量:18709
社区版块
存档分类
最新评论

RUBY中重新定义常量(redefine constants in Ruby)

阅读更多
有个需求:    生产环境中的代码, 有一个常量。
但是需要在测试环境中修改它,把它从一个真正的对象变成mock object.

(提示:核心方法:  const_set, const_defined? , remove_const )

所以搜索了一下,有这个文章:
( http://stackoverflow.com/a/3377188/445908 )

先定义这个module
module RemovableConstants

  def def_if_not_defined(const, value)
    self.class.const_set(const, value) unless self.class.const_defined?(const)
  end

  def redef_without_warning(const, value)
    self.class.send(:remove_const, const) if self.class.const_defined?(const)
    self.class.const_set(const, value)
  end
end

然后就可以调用它了:
class A
  include RemovableConstants

  def initialize
    def_if_not_defined("Foo", "ABC")
    def_if_not_defined("Bar", "DEF")
  end

  def show_constants
    puts "Foo is #{Foo}"
    puts "Bar is #{Bar}"
  end

  def reload
    redef_without_warning("Foo", "GHI")
    redef_without_warning("Bar", "JKL")
  end

end

a = A.new
a.show_constants
a.reload
a.show_constants


运行结果:
引用
Foo is ABC
Bar is DEF
Foo is GHI
Bar is JKL


下面是我自己的代码:

class Apple
  COLOR = "red"
end

puts Apple::COLOR
puts "const_defined?  #{Apple.const_defined?("COLOR")}"
Apple.send(:remove_const, 'COLOR')

# 三种不同的方法,都是定义常量
Apple.class_eval {        COLOR = "yellow"   }
#class Apple;   COLOR="yellow"  ; end
#Apple.const_set("COLOR", "green")
puts Apple::COLOR


运行结果:

引用
red
const_defined?  true
yellow



分享到:
评论

相关推荐

    redefine-function:重新定义功能

    重新定义功能 重新定义功能 安装 $ npm install --save redefine-function 用法 var redefineFunction = require ( "redefine-function" ) var Greetings = { hello : function ( ) { return "Hi there." } } ...

    backbone.redefine:骨干扩展,允许您重新定义类

    为了解决这个问题,`backbone.redefine` 扩展应运而生,它允许你在Backbone框架中重定义已存在的类。 ### 安装 `backbone.redefine` 可以通过Bower这一前端包管理器进行安装。在命令行中输入以下命令: ```bash ...

    redefine:用于智能对象属性定义的轻量级实用程序

    关于重新定义JS 这个约1.5KB(最小化并压缩)的框架在node.js和所有现代移动或桌面浏览器中带来了ES5和ES6功能的强大功能。 主要特点: ES6喜欢类定义,通过mixin和bound魔术具有额外的功能 没有描述符的ES5属性...

    redefine-properties:使用多个源对象定义属性

    通过使用提取的属性描述符重新定义属性,将多个对象的属性合并到目标中。 与多个来源一起使用。 复制所有自己的属性,包括无数属性。 对所有属性使用Object.defineProperty 。 如果发生冲突,则以财产的最后来源...

    lambda 表达式导致 Arthas 无法 redefine 的问题

    Arthas是一款阿里巴巴开源的Java诊断工具,它提供了丰富的命令来帮助开发者在运行时检查和修改Java应用,如`redefine`命令允许开发者动态地重新定义类,而无需重新部署应用。 问题的核心在于JDK版本差异对Lambda...

    C++ 重写重载重定义区别

    在 C++ 编程语言中,重写(Override)、重载(Overload)以及重定义(Redefine 或 Hide)是面向对象编程中非常重要的概念。这三个概念虽然在字面上相似,但它们在实际应用中的含义和作用却大相径庭。接下来,我们将...

    Hexo之hexo-theme-redefine-main博客主题

    在众多的Hexo主题中,“hexo-theme-redefine-main”是一个流行的选择,用于构建美观且功能丰富的个人博客。这个主题以其独特的设计和丰富的自定义选项,帮助用户快速搭建个性化的网站。 首先,让我们深入了解Hexo的...

    使用arthas命令redefine实现Java热更新(推荐)

    redefine 命令在以下几种情况中会失败: 1. 增加了 field ; 2. 增加了 method ; 3. 替换正在运行的方法。 如果在更新代码时增加了新的字段或方法,那么 redefine 命令将失败。同时,如果要更新的方法正在运行,...

    对于初学Materials-Studio-CASTEP问题整理借鉴.pdf

    Nonperiodic 是去掉结构的周期性,Superstructure 是构建超晶胞结构,Make P1 是去掉晶体结构中的所有点对称操作,只保留其平移对称性,Redefine lattice 是重新定义晶胞中基矢的方向。 其次,对于图表的含义是什么...

    java之中的静态变量与静态方法的继承与覆盖问题.doc

    这意味着在子类中定义与父类相同签名的静态方法不会改变父类方法的行为。当通过子类对象调用静态方法时,实际执行的是父类的静态方法。 #### 示例分析 考虑以下代码示例: ```java class A { protected static ...

    NX二次开发UF-DRAW-redefine-sxline-hinge 函数介绍

    NX二次开发UF_DRAW_redefine_sxline_hinge 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...

    C/C++语言宏定义使用实例详解

    //Avoid redefine anything in this header #ifndef UUID_H #define UUID_H // Check platform is Windows or Linux #ifdef _MSC_VER #ifndef DLL_API #define DLL_API __declspec(dllexport) #endif #else #ifndef...

    Sublists of the Academic Word List

    - **重新定义(Redefine)**:指再次定义。 - **重新定义过(Redefined)**:表示已经完成的重新定义动作。 - **重新定义(Redefines)**:表示第三人称单数形式的重新定义动作。 - **重新定义中(Redefining)**:表示正在...

    DynamicNativeAgent:在没有工具或自定义类加载器的情况下重新定义Java类

    DynamicNativeAgent DynamicNativeAgent可以使用本机库重新定义Java类(无需类加载器或Instrumentation)用法AgentFactory . loadNative(); // Load the native in the JVMNativeAgent agent = AgentFactory . ...

    redefine方法

    作者danielalves,源码redefine,这是iOS和mac OS X一个简单的方法,在运行时的方法可以修正的。

    CGH40_r6_converted.zip_CGH40- r6_CREE ADS_r6_cgh40_cgh40045 ads模

    ADS中的CREE管子的模型,自己编写的模型,可以正常使用

    DXP中的板形和图纸

    - 如果需要从头开始重新定义板形,可以执行`Design » Board Shape » Redefine Board Shape`命令。 - 指针将变为一个大十字,背景变黑,原有板形以绿色显示。 - 左击鼠标或按Enter键来创建新的板形角点,在定义...

    Pro_E曲面设计体会

    如果无法设定Normal或Tangent,可能是因为前面的曲线存在问题,可以先释放(Free),修正曲线后再重新定义(Redefine)。 11. 边界复合(Boundary): - 对于碎边界的曲面,建议先将边界复合成一条完整的曲线,...

    A-Robot-in-every-home家家都有机器人.doc

    porary: the emergence of ... The future, as Bill Gates suggests, may indeed hold "A Robot in Every Home," a reality that has the potential to redefine the way we live, work, and interact with technology.

    ProE曲面设计体会

    如果在定义Normal或Tangent时遇到问题,可能是因为前面的曲线没有做好,此时可以先释放(Free),修改曲线后再重新定义(Redefine)。 12. 复合边界与减少PATCH数量: 对于破碎的边界,建议使用复合曲线以实现G1或...

Global site tag (gtag.js) - Google Analytics