标签: redefine

如何在没有警告的情况下重新定义Ruby常量?

我正在运行一些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)

ruby constants redefine redefinition

55
推荐指数
2
解决办法
3万
查看次数

重新定义类方法或类

有没有办法在不使用典型继承的情况下重新定义类或其某些方法?例如:

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_librarymagical_third_party_library或其他任何内容.

为了我的目的,是否可以只在类中添加一个函数?我认为你可以用C#做​​一个叫做"部分类"的东西.

php methods class redefine

47
推荐指数
6
解决办法
6万
查看次数

如果在运行时间之前我不知道长度,我该如何声明一个数组?

我最初有一个数组[1..1000]被定义为全局变量.但是现在我需要那个是n,而不是1000,直到后来才发现n.我知道在填充数组之前n是什么,但我需要它是全局的,因此需要一种方法来在运行时定义全局数组的大小.

Context使用文件中字节的线性转换填充数组.我不知道文件有多大,直到有人想要打开它并且文件可以是任何大小.

arrays delphi global-variables redefine dynamic-arrays

34
推荐指数
1
解决办法
6万
查看次数

C预处理器重新定义依赖于包含顺序的冲突

我刚刚在我正在进行的项目中有一次重新定义的冲突,并且在追踪为什么它没有在所有平台上发生(原来是按包含顺序)时,我偶然发现了以下无法解释的行为.

1.没有警告地编译

    #define LIST_HEAD(a) { int a = 0; }                                                                                                                     
    #include <sys/queue.h>                                                          

    int main() {                                                                    
        return 0;                                                               
    }
Run Code Online (Sandbox Code Playgroud)

2."宏重新定义"警告

    #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得到了相同的结果.

c redefine c-preprocessor

12
推荐指数
1
解决办法
505
查看次数

如何重新定义内置的Perl函数?

我想做两件事:

在生产代码中,我想重新定义open命令以使我能够添加自动文件记录.我从事数据处理应用程序/流程的工作,作为其中的一部分,用户必须确切地知道正在处理的文件.如果他们使用旧版本的文件,他们找到的一种方法是阅读正在处理的文件列表.

我可以创建一个新的子进程来执行此日志记录并返回一个文件指针,并在我的代码中使用它代替open.

如果我可以重新定义open并且预先存在的代码可以从这种行为中获益,那将是非常好的.我可以这样做吗?

在调试代码中,我想重新定义printf命令以插入注释以及指示生成该行的代码的写入输出.同样,我有一个sub可以选择这样做,但转换我现有的代码是乏味的.

perl redefine

11
推荐指数
2
解决办法
3104
查看次数

重新定义R包中的函数

我试图通过首先定义一个函数来修改和重新定义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)

r function redefine package

9
推荐指数
1
解决办法
1206
查看次数

我可以将enable_if与typedef一起使用吗?

我想定义一个类型取决于某些条件的变量.我想要这样的东西:

typedef typename enable_if<cond, int>::type Type;
typedef typename enable_if<!cond, double>::type Type;
Run Code Online (Sandbox Code Playgroud)

但是这个conpiler说我重新定义了这种类型.

我怎样才能做到这一点?

c++ templates typedef redefine enable-if

7
推荐指数
2
解决办法
1574
查看次数

XSD:如何重新定义simpleType的数据类型,例如.从xs:string到xs:integer

我正在尝试扩展和定制外部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)

书籍和网似乎也没有太大的帮助,所以我开始质疑这在理论上是否可行.

schema xsd redefine simpletype

6
推荐指数
1
解决办法
2180
查看次数

Python __setattr__ 和 __getattr__ 用于全局范围?

假设我需要创建自己的小型 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表达式的这种“引用”功能?

python lookup redefine quoting variable-assignment

6
推荐指数
1
解决办法
2218
查看次数

避免重新定义预处理器变量

我有各种预处理器变量,它们在不同的库中具有相同的名称.

为了避免冲突,我正在做的是(在示例中,为简单起见,只有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)

是否有一种自动方式来存储所有冲突的变量,取消定义它们并在以后恢复它们?

或者是否可以定义宏来执行这些操作?

c++ variables redefine c-preprocessor

5
推荐指数
1
解决办法
1057
查看次数