所以,我正在重新设计我的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) 我真的需要在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一样.你删除文件,你添加文件.怎么样保存文件的历史?
我有一个包含单个函数的简单模块:
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的参数?
我想了解如何解释冒泡.这是否意味着上升HTML代码层次结构或其他东西?
其次,我正在经历一个例子,我无法理解它所说的最后一部分
基于P的点击处理程序侦听click事件,然后阻止它传播(冒泡)
这是什么意思?
可能重复:
变量名x和xs的历史记录是什么?
模式匹配中的规范名称"xs"来自哪里?
例如in
reverse' [] = []
reverse' [x] = [x]
reverse' (x:xs) = reverse' xs ++ [x]
Run Code Online (Sandbox Code Playgroud)
它应该是"x"的复数吗?
我有一个真实数据的数据集,例如看起来像这样:
# 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)
我怎么能意识到这一点?手动我会为每个值做这样的事情:
Xsmall且最接近的X值大于Xlarge当前X值X.relPos = (X - …我们目前正在从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
构建事件 - >预构建事件,输入此(两行,抱歉格式化):
echo one> out.txt
echo two >> out.txt
从IDE构建项目
RAD Studio命令提示符
IDE
我目前正在使用"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].
在核心语言中,与大多数语言一样,参数是匿名的.
这是否意味着我必须包含某种外部库才能使这段代码有效?
编辑
这是我的~/.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) 我试图在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格式显示结果.
任何帮助都会得到满足.
android ×1
dagger ×1
delphi ×1
delphi-xe3 ×1
elixir ×1
git ×1
haskell ×1
javascript ×1
jquery ×1
json ×1
jsonschema ×1
live ×1
mercurial ×1
ocaml ×1
r ×1
sql ×1
sql-server ×1
statistics ×1
utop ×1
xml ×1