小编Tre*_*son的帖子

编写使用Flow验证的Jest测试的正确方法是什么?

我想人们通常会一起使用Flow和Jest(和React),但Flow似乎并不知道Jest(或Jasmine)全局变量.当我添加// @flow到我的测试时,我得到像这样的Flow错误:

src/__tests__/Thing-test.js:3
  3: jest.unmock('../Thing')
     ^^^^ identifier `jest`. Could not resolve name

src/__tests__/Thing-test.js:7
  7: describe('Thing', () => {
     ^^^^^^^^ identifier `describe`. Could not resolve name

src/__tests__/Thing-test.js:8
  8:   it('does stuff', () => {
       ^^ identifier `it`. Could not resolve name
Run Code Online (Sandbox Code Playgroud)

我可以为Jest/Jasmine编写一个Flow接口,但这似乎很冗长,就像我必须遗漏一些东西.让流程node_modules/jest-cli似乎没有帮助.

jestjs flowtype

46
推荐指数
3
解决办法
1万
查看次数

计算Java String的UTF-8长度而不实际编码它

有谁知道标准Java库(任何版本)是否提供了一种计算字符串二进制编码长度的方法(在本例中为UTF-8)而不实际生成编码输出?换句话说,我正在寻找一个有效的等价物:

"some really long string".getBytes("UTF-8").length
Run Code Online (Sandbox Code Playgroud)

我需要为潜在的长序列化消息计算长度前缀.

java utf-8

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

仅将Maven依赖声明为测试运行时

将Maven依赖项声明为仅用于测试运行时(但不是测试编译)类路径的最佳方法是什么?

具体来说,我希望slf4j-api(一个日志外观)作为典型的编译范围依赖,但我想slf4j-simple(仅适用于单元测试的准分子实现)仅在测试运行时类路径上(测试编译不需要它).我一直这样做:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但是,这方面的缺点是dependency:analyze报告slf4j-simple未使用,大概是因为它不需要编译:

[WARNING] Unused declared dependencies found:
[WARNING]    org.slf4j:slf4j-simple:jar:1.7.7:test
Run Code Online (Sandbox Code Playgroud)

我不能使用runtime依赖项,因为我不希望依赖项传递继承(例如,所以下游依赖项可以使用log4j等).我尝试runtimeoptional=true,但这会产生同样的警告.

(请注意,我也可以设置ignoreNonCompile依赖插件,但这似乎是一个非常生硬的工具,可以隐藏其他潜在的问题.)

java maven-3 maven maven-dependency-plugin

21
推荐指数
2
解决办法
7105
查看次数

Java可以从类型参数边界推断出类型参数吗?

以下测试程序源自一个更复杂的程序,它可以执行一些有用的操作.它与Eclipse编译器成功编译.

import java.util.ArrayList;
import java.util.List;

public class InferenceTest
{
    public static void main(String[] args)
    {
        final List<Class<? extends Foo<?, ?>>> classes =
            new ArrayList<Class<? extends Foo<?, ?>>>();
        classes.add(Bar.class);
        System.out.println(makeOne(classes));
    }

    private static Foo<?, ?> makeOne(Iterable<Class<? extends Foo<?, ?>>> classes)
    {
        for (final Class<? extends Foo<?, ?>> cls : classes)
        {
            final Foo<?, ?> foo = make(cls); // javac error here
            if (foo != null)
                return foo;
        }
        return null;
    }

    // helper used to capture wildcards as type variables
    private …
Run Code Online (Sandbox Code Playgroud)

java generics

20
推荐指数
1
解决办法
3929
查看次数

JAXB纯粹从接口编组

我有一个复杂的Java接口层次结构,我想用JAXB编组(而不一定是unmarshal).这些接口表示将从JAX-RS REST API返回的对象,如XML,JSON,YAML等.(我正在使用RestEasy,它可以用XML以外的格式封送JAXB注释类型.)

问题似乎是JAXB基本上是面向类的.我已经对JAXB和接口的困难进行了大量的网络研究,最接近的解决方案是MOXy JAXB - 映射接口到XMLJAXB以及接口前端模型.但是,我有两个主要问题:a)我想在接口方面注释/工作,而不是具体类(其中将有多个实现并包含不应该被编组的重要其他状态),以及b)我有多级接口继承.这是接口的示例,减去目前为止的任何JAXB注释:

interface Uuided {
  UUID getId();
}
interface Named {
  String getName();
}
interface Component extends Uuided, Named {
  Map<String, ComponentAttribute> getAttributes();
}
interface Attribute extends Named {
  Type getType();
  Object getValue();
}
interface ComponentAttribute extends Attribute {
  Component getDeclaringComponent();
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,这会产生类似于:

<component id="xxx" name="thing">
  <attributes>
    <componentAttribute name="color">
      <type><stringType/></type>
      <value>green</value>
      <declaringComponent idref="xxx"/>
    </componentAttribute>
  </attributes>
</component>
Run Code Online (Sandbox Code Playgroud)

显然,在摘要中,这导致了诸如确定最衍生的带注释的接口之类的问题,理论上可以有多个接口.但是,在我的情况下,我认为具体类只实现了一个应该被封送的单个接口.解组不是必需的,因为我有单独的类定义upsert属性.

所以我的问题是,这甚至可以用JAXB来处理,如果是这样,怎么样?即使我必须非常明确地定义绑定,适配器等,我也希望在JAXB框架内工作以获得RestEasy中所有非XML提供程序的好处.

java jax-rs jaxb

13
推荐指数
2
解决办法
9359
查看次数

从依赖基类访问类型

有谁知道为什么使用声明似乎不适用于从依赖基类导入类型名称?它们适用于成员变量和函数,但至少在GCC 4.3中,它们似乎被忽略了类型.

template <class T>
struct Base
{
  typedef T value_type;
};

template <class T>
struct Derived : Base<T>
{
  // Version 1: error on conforming compilers
  value_type get();

  // Version 2: OK, but unwieldy for repeated references
  typename Base<T>::value_type get();

  // Version 3: OK, but unwieldy for many types or deep inheritance
  typedef typename Base<T>::value_type value_type;
  value_type get();

  // Version 4: why doesn't this work?
  using typename Base<T>::value_type;
  value_type get(); // GCC: `value_type' is not a type
};
Run Code Online (Sandbox Code Playgroud)

我有一个基类,有一组allocator样式的typedef,我想在几个继承级别继承.到目前为止,我发现的最佳解决方案是上面的版本3,但我很好奇为什么版本4似乎不起作用.GCC接受使用声明,但似乎忽略它. …

c++ templates dependent-name using-declaration

11
推荐指数
1
解决办法
3445
查看次数

全局构造函数调用不在.init_array部分

我正在尝试在嵌入式目标(ARM Cortex-M3)上添加全局构造函数支持.让我说我有以下代码:

class foobar
{
    int i;

public:
    foobar()
    {
        i = 100;
    }

    void inc()
    {
        i++;
    }
};

foobar foo;

int main()
{
    foo.inc();
    for (;;);
}
Run Code Online (Sandbox Code Playgroud)

我这样编译:

arm-none-eabi-g++ -O0 -gdwarf-2 -mcpu=cortex-m3 -mthumb -c foo.cpp -o foo.o
Run Code Online (Sandbox Code Playgroud)

当我用objdump查看.init_array部分时,它显示.init_section的大小为零.

我得到一个名为的符号_Z41__static_initialization_and_destruction_0ii.当我反汇编目标文件时,我看到全局构造是在static_initialization_and_destruction符号中完成的.

为什么.init_section中没有将指针添加到此符号?

c++ gcc constructor

9
推荐指数
2
解决办法
8636
查看次数

针对C++多态,可搜索,二进制I/O接口的建议

我一直在使用std::istreamostream作为C++中随机访问二进制I/O的多态接口,但它在许多方面似乎不是最理想的:

  • 由于streampos/streamoff限制,64位寻道是不可移植的并且容易出错; 目前使用boost/iostreams/positioning.hpp作为解决方法,但需要警惕
  • 缺少截断或扩展文件等操作(ala POSIX ftruncate)
  • 具体实施之间的不一致; 例如,stringstream有独立的获取/放置位置,而filestream没有
  • 平台实施之间的不一致; 例如,寻求通过文件结束或使用failbit/ badbit出错的行为
  • 不需要所有的格式化设施,stream甚至可能需要缓冲streambuf
  • streambuf错误报告(即异常与返回错误指示符)在实践中被认为是依赖于实现的

我喜欢Boost.Iostreams Device概念提供的简化界面,但它是作为函数模板而不是多态类提供的.(有一个device,但它不是多态的,只是一个实现的助手类,不一定被提供的设备实现使用.)我主要使用大型磁盘文件,但我真的想要多态,所以我可以轻松替换其他实现(例如使用stringstream,而不是fstream单元测试)没有所有的复杂性和编译时深模板实例的耦合.

有没有人对此有任何标准方法的建议?这似乎是一种常见的情况,所以我不想不必要地创建自己的接口.举个例子,像java.nio.FileChannel这样的东西似乎很理想.

到目前为止,我最好的解决方案是在Boost.Iostreams设备上放置一个薄的多态层.例如:

class my_istream
{
public:
    virtual std::streampos seek(stream_offset off, std::ios_base::seekdir way) = 0;
    virtual std::streamsize read(char* s, std::streamsize n) = 0;
    virtual void close() = 0;
};

template <class T>
class boost_istream : public my_istream …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism file-io iostream boost-iostreams

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

在一个巨大的文件(C++)中进行许多小型盲写的最快方法?

我有一些非常大(> 4 GB)的文件,包含(数百万)固定长度的二进制记录.我希望(有效地)将它们连接到其他文件中的记录,方法是将指针(即64位记录号)写入特定偏移的记录中.

详细说明,我有一对(键,记录号)元组列表,按键排序,我想对给定的一对文件执行每个连接,例如A和B.迭代列表对并匹配键产生表示连接记录的(键,记录号A,记录号B)元组的列表(为简单起见假设1:1映射).为了完成连接,我在概念上需要寻找列表中的每个A记录并在适当的偏移处写入相应的B记录号,反之亦然.我的问题是实际执行此操作的最快方法是什么?

由于连接记录列表按键排序,因此相关记录号基本上是随机的.假设文件比操作系统磁盘缓存大得多,那么做一堆随机搜索和写入似乎效率极低.我已经尝试通过将A-> B和B-> A映射放在稀疏数组中来对记录数进行部分排序,并在每次内存不足时将最密集的条目集群刷新到磁盘.这有利于大大增加在更新其第一个指针后为集群缓存适当记录的机会.然而,即使在这一点上,通常更好的做一堆搜索和盲写,或者手动读取文件的块,更新适当的指针,并把块写回来?虽然前一种方法更简单,并且可以通过操作系统进行优化,以便进行最小的扇区读取(因为它知道扇区大小)和副本(它可以通过直接读入正确对齐的缓冲区来避免复制),但它似乎是将导致极高的系统调用开销.

虽然我喜欢便携式解决方案(即使它涉及对广泛使用的库的依赖,例如Boost),但现代Windows和Linux是唯一的必备软件,因此我可以使用特定于操作系统的API(例如CreateFile)提示或分散/收集I/O).然而,这可能涉及很多工作甚至尝试,所以我想知道是否有人可以告诉我,它是否值得努力.

c++ performance file-io

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