小编Wil*_*urn的帖子

Scala中的Trait,FunctionN或trait-inheriting-FunctionN?

我在Scala中有一个具有单一方法的特征.称之为Computable,单个方法是compute(input:Int):Int.我无法弄清楚我是否应该这样做

  • 使用单一方法将其保留为独立特征.
  • 继承自(Int => Int)并将"compute"重命名为"apply".
  • 只需摆脱Computable并使用(Int => Int).

支持它成为特征的一个因素是我可以有用地添加一些额外的方法.但是当然,如​​果它们都是根据计算方法实现的,那么我可以将它们分解为一个单独的对象.

支持仅使用函数类型的一个因素是简单性以及匿名函数的语法比匿名Computable实例的语法更简洁.但是,我无法区分实际上是Computable实例的对象与将Int映射到Int的其他函数,但不打算在与Computable相同的上下文中使用.

其他人如何处理这类问题?这里没有对错的答案; 我只是在寻求建议.

scala

8
推荐指数
2
解决办法
555
查看次数

JonasBonér的依赖注入策略似乎有限 - 但也许我不明白

我已多次阅读这篇文章:

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)

但这与原始模式不同.在这种情况下,我在组件本身中定义依赖项,而不是从其他组件继承它们.但在我看来,这是正确的方法:组件应该声明它们的依赖关系,而不是它们包含的服务的实例.

我在这里错过了什么?

dependency-injection scala

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

我可以在Scala中创建一个使用不同的equals / hashCode / compare实现的集合吗?

我正在寻找创建身份集的简单方法。我只希望能够跟踪遍历图形时是否“看到”了特定对象。

我不能使用常规Set,因为Set使用“ ==”(Scala中的equals方法)来比较元素。我想要的是一个使用“ eq”的集合。

有什么方法可以在Scala中创建一个Set,该Set使用一些应用程序指定的方法测试相等性,而不是在set元素上调用equals?我在寻找可以覆盖但找不到的“ wrapEquals”方法。

我知道我可以使用Java的IdentityHashMap,但是我正在寻找更通用的东西。

我的另一个想法是将每个set元素包装到另一个根据eq实现equals的对象中,但是生成大量新对象只是为了获得一个新的equals实现是浪费的。

谢谢!

scala scala-collections

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

JVM方法调用和远程调用之间的性能差异是什么?

我正在收集一些有关使用二进制协议(换句话说,不是SOAP)的JVM方法调用和远程方法调用之间性能差异的数据。我正在开发一个框架,该框架可以酌情决定在本地或远程进行方法调用,并且我想知道在更快的服务器或服务器上远程评估该方法的“价值”是什么?计算某种网格。我知道远程通话的速度会慢很多,所以我最想了解幅度的阶差。是慢10倍还是100或1,000?有人对此有任何数据吗?如有必要,我将编写自己的基准,但我希望重用一些现有知识。谢谢!

java performance jvm rmi

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

提升精神X3:"属性没有预期的大小",但它为什么关心?

我正在尝试用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)

c++ boost-spirit boost-spirit-x3

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

为什么 clang-format 会搞砸这段代码?

我的代码库有很多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)

c++ clang clang-format

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

为什么std :: enable_shared_from_this允许多个std :: shared_ptr实例?

有几个问题涵盖了的行为std::enable_shared_from_this,但我认为这不是重复的。

从继承的类std::enable_shared_from_this带有std::weak_ptr成员。当应用程序创建std::shared_ptr指向的子类的指向时std::enable_shared_from_thisstd::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++ shared-ptr weak-ptr c++17 enable-shared-from-this

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