我在Scala中有一个具有单一方法的特征.称之为Computable,单个方法是compute(input:Int):Int.我无法弄清楚我是否应该这样做
支持它成为特征的一个因素是我可以有用地添加一些额外的方法.但是当然,如果它们都是根据计算方法实现的,那么我可以将它们分解为一个单独的对象.
支持仅使用函数类型的一个因素是简单性以及匿名函数的语法比匿名Computable实例的语法更简洁.但是,我无法区分实际上是Computable实例的对象与将Int映射到Int的其他函数,但不打算在与Computable相同的上下文中使用.
其他人如何处理这类问题?这里没有对错的答案; 我只是在寻求建议.
我已多次阅读这篇文章:
http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di.html
我想我明白了.然而,有一些我不太了解的东西.
看看他的UserService示例,我看到他设置了UserRepositoryComponent来封装UserRepository.但我不明白的是UserRepositoryComponent扮演两个角色的原因:它封装了UserRepository,还提供了对UserRepository对象的引用.
我试图想象如果我想创建依赖于两个 UserRepository实例的服务,我将如何使用此模式.也许新服务的工作是将用户从"源"UserRepository复制到"目标"UserRepository.所以我想象的是这样的:
trait CopyUserServiceComponent {
val source: UserRepositoryComponent
val destination: UserRepositoryComponent
class CopyUserServiceComponent {
...
}
}
Run Code Online (Sandbox Code Playgroud)
但这与原始模式不同.在这种情况下,我在组件本身中定义依赖项,而不是从其他组件继承它们.但在我看来,这是正确的方法:组件应该声明它们的依赖关系,而不是它们包含的服务的实例.
我在这里错过了什么?
我正在寻找创建身份集的简单方法。我只希望能够跟踪遍历图形时是否“看到”了特定对象。
我不能使用常规Set,因为Set使用“ ==”(Scala中的equals方法)来比较元素。我想要的是一个使用“ eq”的集合。
有什么方法可以在Scala中创建一个Set,该Set使用一些应用程序指定的方法测试相等性,而不是在set元素上调用equals?我在寻找可以覆盖但找不到的“ wrapEquals”方法。
我知道我可以使用Java的IdentityHashMap,但是我正在寻找更通用的东西。
我的另一个想法是将每个set元素包装到另一个根据eq实现equals的对象中,但是生成大量新对象只是为了获得一个新的equals实现是浪费的。
谢谢!
我正在收集一些有关使用二进制协议(换句话说,不是SOAP)的JVM方法调用和远程方法调用之间性能差异的数据。我正在开发一个框架,该框架可以酌情决定在本地或远程进行方法调用,并且我想知道在更快的服务器或服务器上远程评估该方法的“价值”是什么?计算某种网格。我知道远程通话的速度会慢很多,所以我最想了解幅度的阶差。是慢10倍还是100或1,000?有人对此有任何数据吗?如有必要,我将编写自己的基准,但我希望重用一些现有知识。谢谢!
我正在尝试用Spirit X3编写一个解析器,但我还没有走得太远,因为我遇到了一个我无法弄清楚的编译错误.我想我知道编译器在抱怨什么,但我不明白为什么它会关心.以下代码编译(clang 3.9,Boost 1.62.0)并且有效.(我意识到它的结构很差,并且有常量的内置解析器;我只是试图证明这个问题.)
#define BOOST_SPIRIT_X3_DEBUG
#include <iostream>
#include <boost/spirit/home/x3.hpp>
using namespace std;
namespace x3 = boost::spirit::x3;
namespace lang {
using namespace x3;
struct Constant {
};
rule<class constant_id, Constant> const constant = "constant";
auto const integer_literal = -char_('-') >> +digit;
auto const float_literal = -char_('-') >> +digit >> -(char_('.') >> *digit);
auto const constant_def = (integer_literal)[([](auto &ctx) { _val(ctx) = Constant(); })];
BOOST_SPIRIT_DEFINE(constant);
}
int main(int argc, char *argv[]) {
string s("3.14159");
if (x3::phrase_parse(s.begin(), s.end(), lang::constant, x3::space)) {
cout …
Run Code Online (Sandbox Code Playgroud) 我的代码库有很多std::variant
类型和函数,用于std::visit
根据实际类型实现不同的行为。
我正在使用clang-format
,有时它会扰乱使用的功能std::visit
。我有一个名为 的函数visitor
,它从一堆 lambda 表达式中构建一个访问者。看起来,当 lambda 声明返回类型为 时auto&
,clang-format
决定在每个 lambda 的右大括号之后开始换行,将逗号留在左边距。
这是一个示例函数,其clang-format
格式如下:
struct A {};
struct B {};
typedef std::variant<A, B> AB;
template <class... Ts>
struct visitor : Ts... {
using Ts::operator()...;
};
template <class... Ts>
visitor(Ts...) -> visitor<Ts...>;
AB& f(AB& ab) {
auto v = visitor{[&](const A& a) -> auto& {std::cout << "A" << std::endl;
return ab;
}
, [&](const B& b) -> auto& …
Run Code Online (Sandbox Code Playgroud) 有几个问题涵盖了的行为std::enable_shared_from_this
,但我认为这不是重复的。
从继承的类std::enable_shared_from_this
带有std::weak_ptr
成员。当应用程序创建std::shared_ptr
指向的子类的指向时std::enable_shared_from_this
,std::shared_ptr
构造函数将检查std::weak_ptr
,如果未初始化,则对其进行初始化并将std::weak_ptr
控制块用于std::shared_ptr
。但是,如果std::weak_ptr
已初始化,则构造方法将std::shared_ptr
使用新的控制块创建一个新对象。当两个std::shared_ptr
实例之一的引用计数变为零并删除基础对象时,这会使应用程序崩溃。
struct C : std::enable_shared_from_this<C> {};
C *p = new C();
std::shared_ptr<C> p1(p);
// Okay, p1 and p2 both have ref count = 2
std::shared_ptr<C> p2 = p->shared_from_this();
// Bad: p3 has ref count 1, and C will be deleted twice
std::shared_ptr<C> p3(p);
Run Code Online (Sandbox Code Playgroud)
我的问题是:图书馆为什么会这样?如果std::shared_ptr
构造函数知道对象是std::enable_shared_from_this
子类并且费心检查std::weak_ptr
字段,为什么它不总是对new使用相同的控制块std::shared_ptr
,从而避免了潜在的崩溃?
因此,为什么在未初始化成员shared_from_this
时方法失败 …
c++ ×3
scala ×3
boost-spirit ×1
c++17 ×1
clang ×1
clang-format ×1
java ×1
jvm ×1
performance ×1
rmi ×1
shared-ptr ×1
weak-ptr ×1