我正在运行一些Ruby代码,每次日期更改时都会破坏Ruby文件.在文件中,我有不断的定义,比如
Tau = 2 * Pi
Run Code Online (Sandbox Code Playgroud)
当然,它们使解释器每次都显示不需要的"已初始化的常量"警告,所以,我想要具备以下功能:
def_if_not_defined(:Tau, 2 * Pi)
redef_without_warning(:Tau, 2 * Pi)
Run Code Online (Sandbox Code Playgroud)
通过编写我的所有常量定义,我可以避免警告:
Tau = 2 * Pi unless defined?(Tau)
Run Code Online (Sandbox Code Playgroud)
但它不够优雅,有点潮湿(不是干).
有更好的方法def_if_not_defined吗?怎么样redef_without_warning?
-
谢谢Steve的解决方案:
class Object
def def_if_not_defined(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.const_set(const, value) unless mod.const_defined?(const)
end
def redef_without_warning(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.send(:remove_const, const) if mod.const_defined?(const)
mod.const_set(const, value)
end
end
A = 1
redef_without_warning :A, 2
fail 'unit test' unless A == …Run Code Online (Sandbox Code Playgroud) 有没有办法在不使用典型继承的情况下重新定义类或其某些方法?例如:
class third_party_library {
function buggy_function() {
return 'bad result';
}
function other_functions(){
return 'blah';
}
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能取代buggy_function()?显然这就是我想做的
class third_party_library redefines third_party_library{
function buggy_function() {
return 'good result';
}
function other_functions(){
return 'blah';
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的两难:我更新了破坏我代码的第三方库.我不想直接修改库,因为将来的更新可能会再次破坏代码.我正在寻找一种无缝的方法来替换类方法.
我发现这个图书馆说它可以做到,但我很谨慎,因为它已经4岁了.
编辑:
我应该澄清一下,由于框架限制,我无法将类重命名third_party_library为magical_third_party_library或其他任何内容.
为了我的目的,是否可以只在类中添加一个函数?我认为你可以用C#做一个叫做"部分类"的东西.
我最初有一个数组[1..1000]被定义为全局变量.但是现在我需要那个是n,而不是1000,直到后来才发现n.我知道在填充数组之前n是什么,但我需要它是全局的,因此需要一种方法来在运行时定义全局数组的大小.
Context使用文件中字节的线性转换填充数组.我不知道文件有多大,直到有人想要打开它并且文件可以是任何大小.
我刚刚在我正在进行的项目中有一次重新定义的冲突,并且在追踪为什么它没有在所有平台上发生(原来是按包含顺序)时,我偶然发现了以下无法解释的行为.
#define LIST_HEAD(a) { int a = 0; }
#include <sys/queue.h>
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <sys/queue.h>
#define LIST_HEAD(a) { int a = 0; }
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望这两种情况都能产生警告,因为没有任何检查<sys/queue.h>会阻止重新定义.
那么为什么第一种情况不产生警告,而第二种情况呢?我在这里缺少什么?
顺便说一句:我在Mac上用clang和我的Linux机箱用gcc得到了相同的结果.
我想做两件事:
在生产代码中,我想重新定义open命令以使我能够添加自动文件记录.我从事数据处理应用程序/流程的工作,作为其中的一部分,用户必须确切地知道正在处理的文件.如果他们使用旧版本的文件,他们找到的一种方法是阅读正在处理的文件列表.
我可以创建一个新的子进程来执行此日志记录并返回一个文件指针,并在我的代码中使用它代替open.
如果我可以重新定义open并且预先存在的代码可以从这种行为中获益,那将是非常好的.我可以这样做吗?
在调试代码中,我想重新定义printf命令以插入注释以及指示生成该行的代码的写入输出.同样,我有一个sub可以选择这样做,但转换我现有的代码是乏味的.
我试图通过首先定义一个函数来修改和重新定义R包xcms中的函数(xcmsRaw)
my.xcmsRaw <- function(filename, profstep = 1, profmethod = "bin",
profparam = list(mzcorrf=1), # PATCH - mzcorrf is the m/z correction factor, e.g. 0.99888 for long-chain hydrocarbons
includeMSn = FALSE, mslevel=NULL,
scanrange=NULL) { ... }
Run Code Online (Sandbox Code Playgroud)
然后输入
unlockBinding("xcmsRaw", as.environment("package:xcms"))
assign("xcmsRaw", my.xcmsRaw, as.environment("package:xcms"))
lockBinding("xcmsRaw", as.environment("package:xcms"))
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,它给了我错误
Error in get(as.character(FUN), mode = "function", envir = envir) :
object 'profBinM' of mode 'function' was not found
Run Code Online (Sandbox Code Playgroud)
由于它没有找到profBinM函数,这是一个在xcms包的文件xcms.c中定义的C代码函数.
有关如何解决此问题的任何想法?(我在Windows 7下工作,使用R版本3.0.0)
我想定义一个类型取决于某些条件的变量.我想要这样的东西:
typedef typename enable_if<cond, int>::type Type;
typedef typename enable_if<!cond, double>::type Type;
Run Code Online (Sandbox Code Playgroud)
但是这个conpiler说我重新定义了这种类型.
我怎样才能做到这一点?
我正在尝试扩展和定制外部xsd架构(fixml标准).我需要更改某些元素的数据类型,而不是触及原始模式,而是重新定义它; 但一直发现它非常麻烦.
存在的是什么
场,base.xsd
<xs:simpleType name="LastUpdateTime_t">
<xs:restriction base="UTCTimestamp">
<xs:simpleType>
Run Code Online (Sandbox Code Playgroud)
我希望它变成什么:
<xs:simpleType name="LastUpdateTime_t">
<xs:restriction base="xs:string">
<xs:simpleType>
Run Code Online (Sandbox Code Playgroud)
我尝试了什么(但失败了):
<xs:redefine schemaLocation="fields-base.xsd">
<xs:simpleType name="LastUpdateTime_t">
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:redefine>
Run Code Online (Sandbox Code Playgroud)
书籍和网似乎也没有太大的帮助,所以我开始质疑这在理论上是否可行.
假设我需要创建自己的小型 DSL,它将使用 Python 来描述某种数据结构。例如,我希望能够写出类似的东西
f(x) = some_stuff(a,b,c)
Run Code Online (Sandbox Code Playgroud)
并且使用 Python,不要抱怨未声明的标识符或尝试调用函数 some_stuff,而是将其转换为文字表达式以方便我使用。
__getattr__通过创建一个具有正确重新定义和__setattr__方法的类并按如下方式使用它,可以获得对此的合理近似:
e = Expression()
e.f[e.x] = e.some_stuff(e.a, e.b, e.c)
Run Code Online (Sandbox Code Playgroud)
如果能够去掉烦人的“e”,那就太酷了。前缀,甚至可能避免使用 []。所以我想知道,是否有可能以某种方式暂时“重新定义”全局名称查找和分配?与此相关的是,也许有好的软件包可以轻松实现Python表达式的这种“引用”功能?
我有各种预处理器变量,它们在不同的库中具有相同的名称.
为了避免冲突,我正在做的是(在示例中,为简单起见,只有1个冲突的变量和1个标头):
#ifdef VAR
#define TEMPVAR VAR
#undef VAR
#endif
#include "conflictingheader.hh"
#ifdef VAR
#undef VAR
#endif
#ifdef TEMPVAR
#define VAR TEMPVAR
#undef TEMPVAR
#endif
Run Code Online (Sandbox Code Playgroud)
是否有一种自动方式来存储所有冲突的变量,取消定义它们并在以后恢复它们?
或者是否可以定义宏来执行这些操作?