设置变量一次以供 RSpec 套件中的所有示例使用的常规方法是什么?
我目前设置了一个全局变量,spec_helper用于检查规范是否在“调试模式”下运行
$debug = ENV.key?('DEBUG') && (ENV['DEBUG'].casecmp('false') != 0) && (ENV['DEBUG'].casecmp('no') != 0)
Run Code Online (Sandbox Code Playgroud)
如何在不使用全局变量且不重新计算每个上下文和/或示例的值的情况下使该信息可用于套件中的所有示例?(我的理解是,使用before(:all)块会在每个上下文中重新计算一次;但是,这before(:suite)不能用于设置实例变量。)
(注意:我要求更多地了解解决这个特定问题的优秀设计。我知道一个全局不是什么大问题。)
我的理解是ARMv8 A64汇编中的直接参数可以是12位长.如果是这种情况,为什么这行汇编代码:
AND X12, X10, 0xFEF
Run Code Online (Sandbox Code Playgroud)
产生此错误(使用gcc编译时)
Error: immediate out of range at operand 3 -- `AND X12, X10, 0xFEF'
Run Code Online (Sandbox Code Playgroud)
有趣的是,这行汇编代码编译得很好:
ADD X12, X10, 0xFEF
Run Code Online (Sandbox Code Playgroud)
我正在使用aarch64-linux-gnu-gcc(Linaro GCC 2014.11)4.9.3(预发布)
有没有办法使用reduce或类似的方法将一组过滤器应用于对象数组?
现在,我有这个:
private void applyManyFilters(long[] initialData, LongPredicate... filters) {
LongStream stream = Arrays.stream(initialData);
for (LongPredicate filter : filters) {
stream = stream.filter(filter);
}
long[] dataToUse = stream.toArray();
// Use filtered data
}
Run Code Online (Sandbox Code Playgroud)
更优雅的解决方案看起来像这样:
private void applyManyFilters(long[] initialData, LongPredicate... filters) {
long[] dataToUse = Arrays.stream(filters).reduce(Arrays.stream(initialData), (a, b) -> a.filter(b)).toArray();
// Use filtered data here
}
Run Code Online (Sandbox Code Playgroud)
当然,上面的例子不能编译,因为两个参数都reduce需要,而LongPredicate不是LongStream.我很好奇上面的代码是否可以写成一行?
(PS为了清楚起见,这是一个关于Java 8如何工作的问题,而不是关于样式的问题.我同意单行方法几乎不像循环一样可读.)
执行以下操作的正确gnu汇编语法是什么:
.section .data2
.asciz "******* Output Data ********"
total_sectors_written: .word 0x0
max_buffer_sectors: .word ((0x9fc00 - $data_buffer) / 512) # <=== need help here
.align 512
data_buffer: .asciz "<The actual data will overwrite this>"
Run Code Online (Sandbox Code Playgroud)
具体来说,我正在编写一个玩具OS。上面的代码是16位实模式。我正在设置一个数据缓冲区,该缓冲区将转储回启动磁盘。我想计算之间的扇区数data_buffer放置在内存中的位置与该数据缓冲区的上限。(地址0x9fc00是缓冲区将运行到保留用于其他目的的RAM的位置。)
我知道我可以编写汇编代码来计算这个;但是,由于它是在构建时就知道的常数,所以我很好奇能否让汇编器为我计算它。
我遇到了三个具体问题:
(1)如果我使用$data_buffer此错误:
os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: can't resolve `L0' {*ABS* section} - `$data_buffer' {*UND* section}
Run Code Online (Sandbox Code Playgroud)
我会感到困惑,因为$当我想要标签的内存地址时,应该使用它,对吗?
(2)如果我使用data_buffer而不是$data_buffer,则会出现此错误:
os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: value of 653855 too …Run Code Online (Sandbox Code Playgroud) 有没有简洁的方法指向模板化函数的所有实例而不使用宏?
我有几个模板化的函数,我想测试各种类型:
template<typename T>
void function1() {
return;
}
template<typename T>
void function2() {
return;
}
template<typename T>
void function3() {
return;
}
Run Code Online (Sandbox Code Playgroud)
我可以用宏来做到这一点:
#define TEST_ACROSS_TYPES(fn) \
fn<int>(); \
fn<bool>(); \
fn<char>(); \
fn<double>(); \
TEST_ACROSS_TYPES(function1);
TEST_ACROSS_TYPES(function2);
Run Code Online (Sandbox Code Playgroud)
但是,(1)宏是丑陋的,很难让其他人遵循,(2)我正在使用CATCH,当使用宏来设置测试用例时这并不好用.
有没有办法做这样的事情:
void testAcrossTypes(SomeType f) {
f<int> ();
f<bool> ();
f<char> ();
f<double> ();
}
Run Code Online (Sandbox Code Playgroud)
除了定义问题外,它看起来更清晰SomeType.这个问题(如何定义具有模板参数的函数指针的typedef)解释了如何定义指向模板化函数的指针; 但是,要求指定模板参数.
为了澄清:想象一下function1,function2和function3每测试一个不同的模板函数.每个功能需求进行测试int,byte,char,double,等我想避免明确设置了许多(即num_functions*num_types)每个功能测试.相反,我想有一个指向测试功能(一个单一的方法function1,function2等),并运行它为每个模板类型,从而巩固
function1<int>(); …Run Code Online (Sandbox Code Playgroud) 有没有办法将模板参数"捆绑"在一起以避免重复?
我有几个类和函数都使用相同的三个模板参数.拥有一次使用每个类/函数的函数并不罕见.结果代码非常快速地变得非常混乱.是否有更简洁的方法来编写此代码?
// ContextFactory is a pointer to functions that instantiate objects that are subtypes of MetricContext
template<typename VertexID, typename EdgeMembershipType, typename SetBitmap>
using ContextFactory = MetricContext <VertexID, EdgeMembershipType, SetBitmap> *(*)(const char *);
template<typename VertexID, typename EdgeMembershipType, typename SetBitmap>
static vector<ContextFactory<VertexID, EdgeMembershipType, SetBitmap>> buildCFList() {
vector<ContextFactory<VertexID, EdgeMembershipType, SetBitmap>> answer;
answer.push_back(MetricContext<VertexID, EdgeMembershipType, SetBitmap>::template make<NeoContext<VertexID, EdgeMembershipType, SetBitmap >>);
return answer;
};
Run Code Online (Sandbox Code Playgroud)
请注意,此函数的近一半是字符串的重复<VertexID, EdgeMembershipType, SetBitmap>>,但每次使用此字符串都适用于不同的类或函数,因此我认为别名不起作用.
(如果它有帮助,这个函数的目的是创建一个指向函数的指针数组,这些函数将创建作为子类型的子对象的对象 MetricContext<VertexID, EdgeMembershipType, SetBitmap>>
下面的代码在我的 mac 上出现段错误;但是,在 Linux 上工作正常(甚至没有 valgrind 错误)。
我怀疑比较函数给出了不一致的结果;但是,我看不到如何。
(我有一种感觉,当有人指出时,我会觉得自己很愚蠢:)
上下文:这是学生的代码。我知道有更好的编码方法,我只是不知道为什么它是错误的。
using namespace std;
using Point = std::pair<double, double>;
using PointVector = vector<Point>;
extern PointVector cluster1;
bool sortComparison(const Point &point1, const Point &point2) {
if(point1.first < point2.first)
return true;
else if(point1.first > point2.first)
return false;
else if(point1.second < point2.second)
return true;
else if(point1.second > point2.second)
return false;
else
return true;
}
int main(int argc, char *argv[]) {
cout << "In" << endl;
std::sort(cluster1.begin(), cluster1.end(), sortComparison);
cout << "Out" << endl;
}
Run Code Online (Sandbox Code Playgroud) 图形可以表示为邻接矩阵或邻接列表.我的Graph对象将图形表示为邻接矩阵.出于性能原因,除非有要求,否则我不会计算邻接表; 但是,一旦提出要求,我想保留清单(以避免重新建立).
是否适合制作邻接列表mutable,以便用户可以为其他const Graph对象生成邻接列表?我问,因为我不相信构建邻接矩阵会被视为"物理"而不是"逻辑"改变状态Graph.我也有一个adjacencyListBuilt方法,因此邻接列表的构建不是"不可见的"(参见https://isocpp.org/wiki/faq/const-correctness#mutable-data-members).
如果我理解正确,声明adjacencyList实例变量mutable将允许任何方法更新它.有没有办法只有buildAdjacencyList方法能够修改对象adjacencyList上的实例变量const?