我有一个仅由静态属性组成的类,充当一种穷人的单例。其目的是从应用程序的各个点收集统计信息。对于我们的单元测试,我创建了一个卷影拷贝,可用于获取生产代码中的差异。
例子:
struct Production {
static ComplexClass value1;
static ComplexClass value2;
};
struct ProductionShadow {
static ComplexClass::ValueType value1;
static ComplexClass::ValueType value2;
};
由于所有成员都是静态的,影子类不能从生产类继承,并且生产类中的属性是具有副作用的复杂对象,我只希望影子保存简单的值以进行比较。
为了使影子类更易于维护,我想添加一个静态断言来检查每当有人向生产类添加属性时影子类也会更新。
如果属性不是静态的,这可以通过执行以下操作轻松完成:
enum { NumberOfProductionAttributes = sizeof(Production) / sizeof(ComplexClass),
NumberOfShadowAttributes = sizeof(ProductionShadow) / sizeof(ComplexClass::ValueType) };
STATIC_ASSERT(NumberOfProductionAttributes == NumberOfShadowAttributes);
除了使类成为非静态类(我宁愿不这样做,因为我必须将生产类变成适当的单例)之外,还有什么方法可以用当前的实现完成此检查吗?
在运行时,我有一个方法可以使用生产类验证影子中的所有值。由于在添加新属性时也必须更新该方法,因此我希望能够计算已验证的属性数量,并在数量与属性总数不同时断言。
例子
bool ProductionShadow::verify() {
std::size_t numberOfVerified = 0;
#define VERIFY(x) do { \
++numberOfVerified; \
// Verification code goes here \
} while (0)
VERIFY(value1);
VERIFY(value2);
ASSERT(numberOfVerified == NumberOfShadowAttributes);
// Return result
}
如果有我可以使用的 GCC 扩展,那可能是一个可以接受的解决方案,即使我更喜欢可移植的东西。
最佳答案
以防万一,这是我在问题评论中建议的解决方案。这个想法是创建两个类,以非静态成员的形式包含有问题的数据成员:
struct ProductionStaticMembers
{
ComplexClass value1;
ComplexClass value2;
};
struct ProductionShadowStaticMembers
{
ComplexClass::ValueType value1;
ComplexClass::ValueType value2;
};
然后重新定义原始类以包含上面定义的类作为静态成员。它们将继续像以前一样运行,并且可以针对上面定义的类型执行大小检查。
struct Production {
static ProductionStaticMembers static_members;
};
struct ProductionShadow {
static ProductionShadowStaticMembers static_members;
};
诚然,这意味着访问静态成员的方式发生了变化(因为它们现在是另一个成员的成员);因此可能需要对现有代码进行许多更改。
关于c++ - 获取类中静态属性的个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10223975/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el