小编Fra*_*itt的帖子

使用Dagger在构造函数上进行依赖注入

所以,我正在重新设计我的Android应用程序以使用Dagger.我的应用程序庞大而复杂,我最近遇到了以下情况:

对象A需要一个特殊的DebugLogger实例,这是一个完美的注入候选者.我可以通过A的构造函数注入它,而不是绕过记录器.这看起来像这样:

class A
{
    private DebugLogger logger;

    @Inject
    public A(DebugLogger logger)
    {
        this.logger = logger;
    }

    // Additional methods of A follow, etc.
}
Run Code Online (Sandbox Code Playgroud)

到目前为止这是有道理的.但是,A需要由另一个类B构造.必须构造A的多个实例,所以遵循Dagger的做事方式,我简单地将一个注入Provider<A>到B中:

class B
{
    private Provider<A> aFactory;

    @Inject
    public B(Provider<A> aFactory)
    {
        this.aFactory = aFactory;
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,到目前为止还不错.但等等,突然A需要额外的输入,例如一个称为"数量"的整数,这对于它的构造至关重要.现在,我的A构造函数需要如下所示:

@Inject
public A(DebugLogger logger, int amount)
{
...
}
Run Code Online (Sandbox Code Playgroud)

突然,这个新参数干扰了注射.而且,即使这确实有效,除非我弄错了,否则在从提供者检索新实例时我无法传递"金额".我可以在这里做几件事,我的问题是哪一个是最好的?

我可以通过添加一个setAmount()预期在构造函数之后调用的方法来重构A. 然而,这是丑陋的,因为它迫使我延迟A的构造直到"数量"被填入.如果我有两个这样的参数,"数量"和"频率",那么我将有两个安装者,这将意味着要么复杂的检查以确保在调用两个setter之后恢复A的构造,或者我将不得不在混合中添加第三个方法,如下所示:

(Somewhere in B):

A inst = aFactory.get();
inst.setAmount(5);
inst.setFrequency(7);
inst.doConstructionThatRequiresAmountAndFrequency();
Run Code Online (Sandbox Code Playgroud)

另一种选择是我不使用基于构造函数的注射并使用基于场的注射.但现在,我必须把我的田地公之于众.这对我来说并不合适,因为现在我有义务将我班级的内部数据透露给其他班级.

到目前为止,我能想到的唯一优雅的解决方案是为提供者使用基于字段的注入,如下所示:

class A
{
    @Inject
    public Provider<DebugLogger> loggerProvider; …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger

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

hg addremove in git

我真的需要在git中使用这个命令

hg addremove
Run Code Online (Sandbox Code Playgroud)

所以现在看一下场景,看看mercurial会如何拯救我:

我在这里有一些dir/htdocs/static/static.我不小心将文件移动到错误的位置(使用git-mv).无论如何......现在我手动移动了一些文件夹:

mv static static2
mv static2/static ./
Run Code Online (Sandbox Code Playgroud)

也许我已经在这里更改了一些文件......现在一切都很棒......所以现在git不知道发生了什么?他如何能够跟踪文件的移动而不用像mercurial那样通知addremove.

例如,现在我可以做mercurial:

hg addremove --similarity 80%
Run Code Online (Sandbox Code Playgroud)

就是这样 - 通过识别文件内容来追踪文件被移动的地方,并保存了我的文件历史记录.

这里的一个小伙子有一些技巧:

git add .
git ls-files --deleted | xargs git rm
Run Code Online (Sandbox Code Playgroud)

但那就像当时的CVS一样.你删除文件,你添加文件.怎么样保存文件的历史?

git mercurial

26
推荐指数
3
解决办法
9144
查看次数

JSON模式draft4 VS JSON模式draft3

模式草案4中存在哪些不在IETF生成的JSON模式草案3中的功能?

json jsonschema

18
推荐指数
2
解决办法
4654
查看次数

如何调用Enum.map中的模块函数而不会出现"未定义的引用"错误?

我有一个包含单个函数的简单模块:

defmodule Funcs do

  def double(x) do
    x*2
  end

end
Run Code Online (Sandbox Code Playgroud)

当我iex以文件名作为参数开始时,我可以调用该函数:

iex(5)> Funcs.double(3)
6
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用它时Enum.map,我收到一个undefined function错误:

iex(2)> Enum.map([1,2,3,4], Funcs.double)
** (UndefinedFunctionError) undefined function: Funcs.double/0
    Funcs.double()
Run Code Online (Sandbox Code Playgroud)

而如果我只使用类似的匿名函数,一切都按预期工作:

iex(6)> Enum.map([1,2,3,4], fn(x) -> x*2; end)
[2, 4, 6, 8]
Run Code Online (Sandbox Code Playgroud)

如何使用模块函数(不确定这是否是正确的术语)作为Enum.map的参数?

elixir

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

jQuery事件冒泡

我想了解如何解释冒泡.这是否意味着上升HTML代码层次结构或其他东西?

其次,我正在经历一个例子,我无法理解它所说的最后一部分

基于P的点击处理程序侦听click事件,然后阻止它传播(冒泡)

这是什么意思?

javascript jquery live javascript-events event-bubbling

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

模式匹配的名称"xs"来自哪里?

可能重复:
变量名x和xs的历史记录是什么?

模式匹配中的规范名称"xs"来自哪里?

例如in

reverse' []     = []
reverse' [x]    = [x]
reverse' (x:xs) = reverse' xs ++ [x]  
Run Code Online (Sandbox Code Playgroud)

它应该是"x"的复数吗?

haskell functional-programming pattern-matching

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

R中的线性插值

我有一个真实数据的数据集,例如看起来像这样:

# Dataset 1 with known data
known <- data.frame(
    x = c(0:6),
    y = c(0, 10, 20, 23, 41, 39, 61)
)

plot (known$x, known$y, type="o")
Run Code Online (Sandbox Code Playgroud)

现在我想问一个问题是"如果原始数据集的所有中间数据点都在周围测量值之间的直线上,那么0.3的Y值是多少?"

 # X values of points to interpolate from known data
 aim <- c(0.3, 0.7, 2.3, 3.3, 4.3, 5.6, 5.9)
Run Code Online (Sandbox Code Playgroud)

如果你看图:我想得到Y​​值,其中ablines与已知数据的线性插值相交

abline(v = aim, col = "#ff0000")
Run Code Online (Sandbox Code Playgroud)

因此,在理想情况下,我将使用我已知的数据创建"linearInterpolationModel",例如

model <- linearInterpol(known)
Run Code Online (Sandbox Code Playgroud)

...然后,我可以询问Y值,例如

model$getEstimation(0.3)
Run Code Online (Sandbox Code Playgroud)

(在这种情况下应该给出"3")

abline(h = 3, col = "#00ff00")
Run Code Online (Sandbox Code Playgroud)

我怎么能意识到这一点?手动我会为每个值做这样的事情:

  1. 什么是最接近的X值较小Xsmall且最接近的X值大于Xlarge当前X值X.
  2. 计算较小X值的相对位置 relPos = (X - …

statistics interpolation r

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

Delphi XE3:复杂的预构建事件的问题

我们目前正在从Delphi XE切换到Delphi XE3,我们的预构建事件存在严重问题.

我们的预构建事件如下所示:

  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc
  brcc32 -foProject.res VersionInfo.rc
Run Code Online (Sandbox Code Playgroud)

(请注意,这两个命令出现在单独的行中;并且在我们的"真实"命令中包含绝对路径),即我们首先从工作副本中提取当前SVN版本,将此信息写入VersionInfo.rc然后使用Borland资源编译器生成资源文件.

这在以前的Delphi版本中完美运行,但每当我们在XE3中打开项目选项时,XE3会将其转换为:

  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc &brcc32 -foProject.res VersionInfo.rc
Run Code Online (Sandbox Code Playgroud)

(请注意,这是一行,两个命令由单个&符号分隔).这会导致构建失败.

我们当前的解决方法是手动将其更改为

  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc && brcc32 -foProject.res VersionInfo.rc
Run Code Online (Sandbox Code Playgroud)

即如果第一个命令成功,我们使用两个&符号来执行第二个命令.

这有效,但只有在我们再次编辑项目选项之前 - Delphi XE3总是弄乱预构建事件:-(

有人知道解决方案/解决方法吗?我想我们可以编写一个简单的命令行工具来调用SubWCRev和brcc32,但我更喜欢一个更简单的解决方案.

更新:轻松重现此错误的步骤

IDE

  • 文件 - >新建 - > VCL表单应用程序(Delphi)
  • 构建Project1
  • 文件 - >全部保存,保留建议名称Unit1.pas/Project1.dpr
  • 项目 - >选项
  • 选择目标"所有配置 - 所有平台"
  • 构建事件 - >预构建事件,输入此(两行,抱歉格式化):

    echo one> out.txt

    echo two >> out.txt

  • 从IDE构建项目

  • 保存并关闭项目

RAD Studio命令提示符

  • 导航到项目目录
  • msbuild Project1.dproj =>好的

IDE

  • 项目 - >选项
    • 点击"搜索路径"
      • 进入一个"
      • 删除"a" …

delphi delphi-xe3

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

"错误:使用命名参数时,应用于此参数的函数具有类型..."

我目前正在使用"Real Word OCaml",其中一个带有命名/标记参数的基本示例似乎不起作用(使用utop 4.01.0):

let languages = ["OCaml"; "Perl"; "C"];;
List.map ~f:String.length languages;;
Run Code Online (Sandbox Code Playgroud)

生产:

Error: The function applied to this argument has type 'a list -> 'b list
This argument cannot be applied with label ~f
Run Code Online (Sandbox Code Playgroud)

鉴于:

List.map String.length languages;;
Run Code Online (Sandbox Code Playgroud)

产生预期的输出[5; 4; 1].

caml.inria.fr提到:

在核心语言中,与大多数语言一样,参数是匿名的.

这是否意味着我必须包含某种外部库才能使这段代码有效?

编辑 这是我的~/.ocamlinit文件(根据本书安装说明):

(* Added by OPAM. *)
let () =                
  try Topdirs.dir_directory (Sys.getenv "OCAML_TOPLEVEL_PATH")
  with Not_found -> ()
;;

#use "topfind"
#camlp4o
#thread
#require "core.top" …
Run Code Online (Sandbox Code Playgroud)

ocaml named-parameters utop

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

使用SQL查询进行XML解析

我试图在sql server中解析下面的xml来获取所有3个ID

<Configuration>
  <ID>1000</ID>
  <ID>1001</ID>
  <ID>1002</ID>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

使用查询

SELECT  CONFIGURATION.value('/', 'varchar(200)') as SID FROM SCHEDULE 
Run Code Online (Sandbox Code Playgroud)

我得到的结果为100010011002,但我希望以列或CSV格式显示结果.

任何帮助都会得到满足.

xml sql sql-server

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