我试图动态创建一个常量名称,然后获取该值.
define( CONSTANT_1 , "Some value" ) ;
// try to use it dynamically ...
$constant_number = 1 ;
$constant_name = ("CONSTANT_" . $constant_number) ;
// try to assign the constant value to a variable...
$constant_value = $constant_name;
Run Code Online (Sandbox Code Playgroud)
但是我发现$ constant值仍然包含常量的NAME,而不是VALUE.
我也尝试了第二级间接$$constant_name
但是这会使它变量而不是常量.
有人可以对此有所了解吗?
在Python中,是否存在C
预处理器语句的类似物,例如?:
#define MY_CONSTANT 50
另外,我有一个很大的常量列表,我想导入几个类.是否有类似的方法将常量声明为.py
文件中的上述长序列语句并将其导入另一个.py
文件?
编辑.
该文件Constants.py
为:
#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""
MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51
Run Code Online (Sandbox Code Playgroud)
并myExample.py
读:
#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""
import sys
import os
import Constants
class myExample:
def __init__(self):
self.someValueOne = Constants.MY_CONSTANT_ONE + 1
self.someValueTwo = Constants.MY_CONSTANT_TWO + 1
if __name__ == '__main__':
x = MyClass()
Run Code Online (Sandbox Code Playgroud)
编辑.
从编译器,
NameError:"未定义全局名称'MY_CONSTANT_ONE'"
第13行的myExample中的函数init self.someValueOne = Constants.MY_CONSTANT_ONE + 1复制输出程序在0.06秒后退出代码#1.
static const
和之间有什么区别const
?例如:
static const int a=5;
const int i=5;
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别吗?你什么时候用一个而不是另一个?
我不确定哪两个更好地定义常量.结构或枚举.每次使用它时都会复制一个结构?当我想到一个带有static let
常量的结构时,在我看来,它一直都会被复制是没有意义的.但如果它不会被复制,那么我采取什么并不重要?
结构或枚举的选择有什么优势?
简单的问题 - 为什么Decimal类型定义了这些常量?何必?
我正在寻找这个由语言定义的原因,而不是对编译器的可能用途或影响.为什么首先把它放在那里?编译器可以像在Decimal.Zero中一样轻松地在线0m,所以我不会将它作为编译器快捷方式购买.
以下代码给出了错误:
// constants.h
extern NSArray const *testArray;
Run Code Online (Sandbox Code Playgroud)
// constants.m
NSArray const *testArray = [NSArray arrayWithObjects: @"foo", @"bar", nil];
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
initializer element is not constant
或者,如果我拿走指针指针(*),我得到:
statically allocated instance of Objective-C class 'NSArray'
是否有一个Java包,包含所有烦人的时间常数,如毫秒/秒/分钟,分钟/小时/天/年?我不想复制那样的东西.
今天我偶然发现了Ruby常量的棘手问题.在我们的团队中,有人创建了一个模块,该模块包含在多个模型中.在我们的(规范)测试输出中,这会产生警告消息,例如:
/home/ayrton/project/lib/life_cycle.rb:5:警告:已初始化常量RESET
解决这个问题的一种方法是,声明你的常量如下:
module LifeCycle
unless (const_defined?(:RESET))
RESET = 'reset'
end
#...
end
Run Code Online (Sandbox Code Playgroud)
我还阅读了一篇由Avdi Grimm撰写的博客文章,该文章提供了另一种解决方案,我想知道你对此事的看法.
我为什么要写(正如我的同事所说):
import static org.apache.commons.lang.math.NumberUtils.INTEGER_ONE;
if (myIntVariable == INTEGER_ONE) { ... }
Run Code Online (Sandbox Code Playgroud)
代替:
if (myIntVariable == 1) { ... }
Run Code Online (Sandbox Code Playgroud)
?
我知道建议使用常量,但我认为价值NumberUtils.INTEGER_ONE
永远不会改变!所以我写1
.
一个相当理论的问题......为什么常量引用的行为与常量指针的行为不同,我实际上可以更改它们指向的对象?它们看起来像是另一个简单的变量声明.我为什么要用它们?这是我运行的一个简短示例,它编译并运行时没有错误:
int main (){
int i=0;
int y=1;
int&const icr=i;
icr=y; // Can change the object it is pointing to so it's not like a const pointer...
icr=99; // Can assign another value but the value is not assigned to y...
int x=9;
icr=x;
cout<<"icr: "<<icr<<", y:"<<y<<endl;
}
Run Code Online (Sandbox Code Playgroud)