小编Tro*_*els的帖子

在管道上打开ifstream,没有数据而没有阻塞

我试图使用ifstream打开一个命名管道,最终将数据写入它.

std::cout << "Opening " << name << std::endl;
std::ifstream manual_shutdown_file(name.c_str());
std::cout << "Opened " << name << std::endl;
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,它在ifstream构造函数中阻塞.我看到打开控制台的"打开名称",但是没有出现打开的语句.

我知道我正在连接管道,因为如果我执行

$ echo foo > name
Run Code Online (Sandbox Code Playgroud)

从shell中,然后构造函数返回并打印Opened语句.即使我不想立即尝试读取数据,也没有办法打开管道,直到它有数据为止?

c++ fstream named-pipes ifstream

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

可以使用默认方法实现在基类中实现抽象方法吗

如果我有一个带有抽象方法的类:

abstract class Base {
    abstract void foo();
}
Run Code Online (Sandbox Code Playgroud)

以及一个使用默认实现声明相同方法的接口:

interface Inter {
     default void foo() {
         System.out.println("foo!");
     }
}
Run Code Online (Sandbox Code Playgroud)

我是否需要在实现/扩展两者的类中提供实现?

class Derived extends Base implements Inter {

}
Run Code Online (Sandbox Code Playgroud)

看起来这应该可以工作,但是我收到一个编译错误,该错误Derived不是抽象的并且不会覆盖抽象方法foo

我猜测类的抽象方法比接口的默认方法“更重要”。

有什么好的方法可以使这项工作?

我的潜在的问题是,我有三级抽象类的层次结构(AB延伸CDE延伸FCF延伸G),其将具有叶类的多个实现。在每组实现中,都有一些在基类中定义的通用方法被实现,所以我希望写

abstract class C extends G {
     abstract void foo();
     abstract void bar();
     abstract void quz();
     void baz() {
         foo();
         bar();
     }
}

abstract class A …
Run Code Online (Sandbox Code Playgroud)

java inheritance default

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

与 maturin 混合的 python/rust 项目中的预发布版本号

我正在开发一个使用 maturin 构建的混合 Rust/Python 项目。我无法弄清楚如何指定可以通过 pip 安装的预发行版本。

我的 Cargo.toml 的开头是

[package]
version = "0.0.1-test.1"
Run Code Online (Sandbox Code Playgroud)

当我这样做时maturin build --release,它就创造了my_project-0.0.1_test.1-cp39-cp39-macosx_10_7_x86_64.whl。请注意,0.0.1-test.1在版本中更改为0.0.1_test.1wheel 文件的名称。(破折号变成了下划线。)

如果我将其发布到我的 Nexus 服务器并尝试将其安装在单独的项目中,pip则会出现错误:

$ pip install  my_project==0.0.1_test.1
Looking in indexes: ...
ERROR: Could not find a version that satisfies the requirement my_project==0.0.1_test.1 (from versions: 0.0.1-test.1, 0.0.1.dev1)
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用破折号而不是下划线:

pip install  py_mod_query_builder==0.0.1-test.1
Looking in indexes: ...
ERROR: Exception:
<stack trace>
pip._vendor.packaging.version.InvalidVersion: Invalid version: '0.0.1-test.1'
Run Code Online (Sandbox Code Playgroud)

如果我将 Cargo.toml 中的版本更改为 0.0.1_troy.1,则 Cargo 无法解析构建文件:

$ maturin build --release …
Run Code Online (Sandbox Code Playgroud)

python version rust

5
推荐指数
0
解决办法
315
查看次数

枚举的各个值是否可以实现接口

一个enum可以实现一个接口。某些值是否可以实现接口?我正在考虑的用例是一个标记接口,因此类似于以下内容:

interface Foo {}
interface Bar {}

enum Widgets {
  FOO implements Foo,
  BAR_1 implements Bar,
  BAR_2 implements Bar
}
Run Code Online (Sandbox Code Playgroud)

这不能在 Java 1.8 下编译。我知道在内部,为 FOO 和 BAR_1 创建了单独的类,所以这似乎是可能的,但我可以很容易地看到标准不支持它。

应该工作的类似的东西是

interface Widgets;
enum Foo implements Widgets { FOO };
enum Bar implements Widgets { BAR_1, BAR_2 };
Run Code Online (Sandbox Code Playgroud)

这有一个缺点,我不能只做Widgets.values()并获得所有的小部件。

java enums

4
推荐指数
1
解决办法
733
查看次数

全局和本地安装后未找到本地吞咽

我已经gulp在全球范围内安装了

sudo npm install --global gulp-cli
Run Code Online (Sandbox Code Playgroud)

和本地

npm install --save-dev gulp
Run Code Online (Sandbox Code Playgroud)

/usr/local/bin/gulp存在,./node_modules/gulp并且./node_modules/gulp-cli存在。

当我尝试gulp在命令行上运行时,出现常见错误

$ gulp
[00:55:43] Local gulp not found in ~/dev/myProj/play-java-seed
[00:55:43] Try running: npm install gulp
Run Code Online (Sandbox Code Playgroud)

我注意到的一件事是,如果我gulp在某个随机目录 (~/foo) 中运行,则错误消息是在该目录中找不到本地 gulp。如果我从正确的目录 (~/dev/myProj/play-java-seed/ui) 运行它,那么错误会引用父目录。

错误信息中的目录中实际上没有安装gulp;它安装在较低的目录中。

/usr/local/bin/gulp 是具有以下内容的文件的符号链接:

#!/usr/bin/env node

'use strict';

require('../')();
Run Code Online (Sandbox Code Playgroud)

..在该文件中是否正确?看起来很奇怪,但我之前没有仔细看过。

如果操作系统很重要,我运行的是 32 位 Ubuntu 16.04。

devDependencies在我的package.json包括gulpgulp-cli

gulp

4
推荐指数
1
解决办法
6608
查看次数

设置了neo4j和密码的Docker容器

我正在尝试创建一个运行Neo4j服务器的docker镜像,并且不要求用户在初始访问时手动设置密码.

我有这个作为Dockerfile

FROM neo4j:3.2
ADD setPassword.sh .
RUN ./setPassword.sh
Run Code Online (Sandbox Code Playgroud)

运行此脚本

#!/bin/sh

set -e

# Start server
./bin/neo4j start

# Wait for it to start
while [ -z "$(grep 'Remote interface available' /var/lib/neo4j/logs/neo4j.log)" ]
do
    echo Waiting for neo4j to start
    sleep 1
done

# Set the password via REST
wget --header="Content-Type: application/json" \
     --post-data='{"password": "newPassword"}'    \
     http://neo4j:neo4j@localhost:7474/user/neo4j/password

# Shut down the server
./bin/neo4j stop

tail -f /var/lib/neo4j/logs/neo4j.log &
sleep 10
# EOF
Run Code Online (Sandbox Code Playgroud)

该脚本启动Neo4j服务器,等待它启动,然后使用REST API设置密码.之后,它会关闭服务器并等待一段时间以确保它已关闭,以便内存中的任何内容都刷新到磁盘.

该脚本似乎运行没有错误,我能够创建一个新的图像.但是,当我运行图像并使用浏览器连接时,密码仍然是neo4j.

查看wget没有参数的输出:

BusyBox v1.26.2 …
Run Code Online (Sandbox Code Playgroud)

neo4j dockerfile

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

在 Rust 中将值本地存储为动态特征类型

我的代码有点像

trait Checker {
   fn check(&self, value: &str) -> bool;
}

struct ShortChecker {}
impl Checker for ShortChecker {
   fn check(&self, value: &str) -> bool {
      value.len() < 5
   }
}

struct PrefixChecker {
   prefix: String,
}
impl Checker for PrefixChecker {
   fn check(&self, value: &str) -> bool {
      value.starts_with(self.prefix)
   }
}

fn check(value: &str, which: &str) -> bool {
   let checker = if which == "short" {
      ShortChecker { }
   } else if which == "prefix" {
      PrefixChecker { …
Run Code Online (Sandbox Code Playgroud)

rust

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

获取scala映射的键和值类型

如果我有一个复杂的地图类型,比如

type MyMap = Map[(String, String), List[Map[String, Int]]]
Run Code Online (Sandbox Code Playgroud)

有没有办法做一些事情,比如Map.Key获取密钥的类型(这里,(String, String))?

我希望标准答案是声明作为键和值类型的类,或者使用

type MyMapKey = (String, String)
type MyMapValue = List[Map[String, Int]]
type MyMap = Map[MyMapKey, MyMapValue]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我MyMap在很多地方使用,但只在一个地方使用键和值类型来准备与地图一起使用的数据。因此,键和值类型感觉像是实现细节,不需要与 MyMap 处于同一级别的名称。

这是其他具有表达类型系统的语言的常见功能,因此我希望在 Scala 中找到它,但似乎不存在。

如果这很重要的话,我正在使用 Scala 3。

generics types scala scala-3

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