有个需求: 生产环境中的代码, 有一个常量。
但是需要在测试环境中修改它,把它从一个真正的对象变成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
分享到:
相关推荐
重新定义功能 重新定义功能 安装 $ npm install --save redefine-function 用法 var redefineFunction = require ( "redefine-function" ) var Greetings = { hello : function ( ) { return "Hi there." } } ...
为了解决这个问题,`backbone.redefine` 扩展应运而生,它允许你在Backbone框架中重定义已存在的类。 ### 安装 `backbone.redefine` 可以通过Bower这一前端包管理器进行安装。在命令行中输入以下命令: ```bash ...
关于重新定义JS 这个约1.5KB(最小化并压缩)的框架在node.js和所有现代移动或桌面浏览器中带来了ES5和ES6功能的强大功能。 主要特点: ES6喜欢类定义,通过mixin和bound魔术具有额外的功能 没有描述符的ES5属性...
通过使用提取的属性描述符重新定义属性,将多个对象的属性合并到目标中。 与多个来源一起使用。 复制所有自己的属性,包括无数属性。 对所有属性使用Object.defineProperty 。 如果发生冲突,则以财产的最后来源...
Arthas是一款阿里巴巴开源的Java诊断工具,它提供了丰富的命令来帮助开发者在运行时检查和修改Java应用,如`redefine`命令允许开发者动态地重新定义类,而无需重新部署应用。 问题的核心在于JDK版本差异对Lambda...
在 C++ 编程语言中,重写(Override)、重载(Overload)以及重定义(Redefine 或 Hide)是面向对象编程中非常重要的概念。这三个概念虽然在字面上相似,但它们在实际应用中的含义和作用却大相径庭。接下来,我们将...
在众多的Hexo主题中,“hexo-theme-redefine-main”是一个流行的选择,用于构建美观且功能丰富的个人博客。这个主题以其独特的设计和丰富的自定义选项,帮助用户快速搭建个性化的网站。 首先,让我们深入了解Hexo的...
redefine 命令在以下几种情况中会失败: 1. 增加了 field ; 2. 增加了 method ; 3. 替换正在运行的方法。 如果在更新代码时增加了新的字段或方法,那么 redefine 命令将失败。同时,如果要更新的方法正在运行,...
Nonperiodic 是去掉结构的周期性,Superstructure 是构建超晶胞结构,Make P1 是去掉晶体结构中的所有点对称操作,只保留其平移对称性,Redefine lattice 是重新定义晶胞中基矢的方向。 其次,对于图表的含义是什么...
这意味着在子类中定义与父类相同签名的静态方法不会改变父类方法的行为。当通过子类对象调用静态方法时,实际执行的是父类的静态方法。 #### 示例分析 考虑以下代码示例: ```java class A { protected static ...
NX二次开发UF_DRAW_redefine_sxline_hinge 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...
//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...
- **重新定义(Redefine)**:指再次定义。 - **重新定义过(Redefined)**:表示已经完成的重新定义动作。 - **重新定义(Redefines)**:表示第三人称单数形式的重新定义动作。 - **重新定义中(Redefining)**:表示正在...
DynamicNativeAgent DynamicNativeAgent可以使用本机库重新定义Java类(无需类加载器或Instrumentation)用法AgentFactory . loadNative(); // Load the native in the JVMNativeAgent agent = AgentFactory . ...
作者danielalves,源码redefine,这是iOS和mac OS X一个简单的方法,在运行时的方法可以修正的。
ADS中的CREE管子的模型,自己编写的模型,可以正常使用
- 如果需要从头开始重新定义板形,可以执行`Design » Board Shape » Redefine Board Shape`命令。 - 指针将变为一个大十字,背景变黑,原有板形以绿色显示。 - 左击鼠标或按Enter键来创建新的板形角点,在定义...
如果无法设定Normal或Tangent,可能是因为前面的曲线存在问题,可以先释放(Free),修正曲线后再重新定义(Redefine)。 11. 边界复合(Boundary): - 对于碎边界的曲面,建议先将边界复合成一条完整的曲线,...
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.
如果在定义Normal或Tangent时遇到问题,可能是因为前面的曲线没有做好,此时可以先释放(Free),修改曲线后再重新定义(Redefine)。 12. 复合边界与减少PATCH数量: 对于破碎的边界,建议使用复合曲线以实现G1或...