我想在Java 8中创建一个类,它能够递归地创建一个对象,该对象具有一个方法,该方法根据我添加的参数获取一个函数参数.
例如,我希望能够这样做:
new X().param(23).param("some String").param(someObject)
.apply((Integer a) -> (String b) -> (Object c) -> f(a,b,c))
Run Code Online (Sandbox Code Playgroud)
然后,apply方法将收集的参数应用于给定的函数.
在维护类型安全的同时,我觉得这应该是没有反思的,但我无法弄清楚如何.如果我可以将其转换为Java 8,那么Scala中的解决方案也是受欢迎的.如果不可能,我也会接受解释原因的答案.
到目前为止我所拥有的基本上是这样的:
class ParamCmd<A,X> {
final A param;
public ParamCmd(A param) {
this.param = param;
}
public<B> ParamCmd<B, Function<A,X>> param(B b) {
return new ParamCmd<>(b);
}
public void apply(Function<A,X> f) {
// this part is unclear to me
}
public static void main(String[] args) {
new ParamCmd<Integer,String>(0).param("oops").param(new Object())
// the constructed function parameters are reversed relative to declaration
.apply((Object c) -> (String …Run Code Online (Sandbox Code Playgroud) tl; dr:我正在寻找一种在Jade模板中进行国际化的优雅方法.本质上问题归结为我必须对变量中的字符串进行插值,而不是逐字代码.
问题详情:
在单语Jade模板中,我可以创建一个带有嵌入式标签和变量的元素,如下所示:
p Posted by
span.author= post.author
| on
span.date= post.author
Run Code Online (Sandbox Code Playgroud)
得到类似的东西
<p>Posted by <span style="author">The Author</span> on
<span style="date">2012-03-08</span></p>
Run Code Online (Sandbox Code Playgroud)
但是当我想要将其国际化时,我需要一个单独的字符串,因为在每种语言中单词顺序都不一样.此外,我想隐藏翻译人员的html详细信息,并给他们这样一行:
Posted by #{author} on #{date}
Run Code Online (Sandbox Code Playgroud)
现在当我将这个字符串的i18n-ed版本作为i18n.posted_by_on传递给Jade模板时,它不会对它进行插值,所以我能做的最好的是:
- var author = '<span class="author">$</span>'.replace('$',post.author);
- var date = '<span class="date">$</span>'.replace('$',post.date);
- var header = i18n.posted_by_on
.replace('#{author}',author)
.replace('#{date}',date);
p!= header
Run Code Online (Sandbox Code Playgroud)
这大多打败了漂亮的Jade模板,因为我必须手动进行所有插值.是否有任何方法更好,更紧凑,可读?
当我尝试使用sbt-proguard插件为我的项目组装一个jar时,我总是得到一个 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我尝试增加sbt的堆空间,但事实证明,proguard插件生成了自己的java进程并且-Xmx256M参数是硬编码的.我无法弄清楚如何更改它,而不是更改proguard代码本身.
我在JDK 7上使用sbt 0.12.3和scala 2.10.1的sbt-proguard插件0.2.1
我曾尝试设置javaOptions in proguard := Seq("-Xmx2G")以及javaOptions in proguard += "-Xmx2G",但该插件似乎忽略/覆盖此:
> ps aux|grep java
kaeser 47084 105.1 1.1 2927540 94440 s000 R+ 10:07AM 0:05.52 /usr/bin/java -Xmx256M -cp /Users/kaeser/.ivy2/cache/net.sf.proguard/proguard-base/jars/proguard-base-4.9.jar proguard.ProGuard -include /Users/kaeser/Documents/workspace/pipeline-runner/target/scala-2.10/proguard/configuration.pro
kaeser 45087 0.0 6.3 5312012 531028 s000 S+ 6:03PM 1:24.88 /usr/bin/java -Xmx2G -Xms512M -Xmx2G -Xss1M -XX:MaxPermSize=512m -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -Xshare:off -jar /usr/local/Cellar/sbt/0.12.3/libexec/sbt-launch.jar
Run Code Online (Sandbox Code Playgroud)
我如何将Java选项传递给proguard插件,或以其他方式解决此问题?
我有一些记录类型结构基本上像这样:
type Body x = { x | pos: (Int,Int) }
type Bubble = Body { radius: Int }
type Box = Body { width: Int, height: Int }
Run Code Online (Sandbox Code Playgroud)
现在我想有一个混合列表中的任何一个并执行部分操作Body,但仍然是特殊情况处理Box和Bubble其他时间.例如,有(实现省略):
mv: (Int,Int) -> Body a -> Body a
bubble: Bubble
box: Box
Run Code Online (Sandbox Code Playgroud)
我想要
map (mv (1,1)) [box,bubble]
Run Code Online (Sandbox Code Playgroud)
但这失败了,因为Elm认为列表中的类型不兼容.
现在我可以将Boxes和Bubbles 包装在ADT中,如下所示:
type BodyWrap = BoxWrap Box | BubbleWrap Bubble
Run Code Online (Sandbox Code Playgroud)
但是我需要在每种情况下进行解包和重新打包.如果我想在混合列表上折叠,它会变得更加混乱.这个要点就是一个例子.
有没有更优雅的方式来处理这种情况?
我正在尝试将库从Elm 0.15迁移到0.16.记录扩展机制已被删除.
我的库提供了对物体的物理计算(表示为记录),并使用记录扩展来允许用户添加关于物体的标签和其他元数据.
我的示例代码通过在创建后为所有实体添加标签来显示此用法:
labeledBodies = map (\b -> { b | label = bodyLabel b.restitution b.inverseMass }) someBodies
Run Code Online (Sandbox Code Playgroud)
此标记实体列表也会传递给库:
main = Signal.map scene (run labeledBodies tick)
Run Code Online (Sandbox Code Playgroud)
什么样的工作:将meta参数硬编码为Body:
type alias Body a = {
pos: Vec2, -- reference position (center)
velocity: Vec2, -- direction and speed
inverseMass: Float, -- we usually use only inverse mass for calculations
restitution: Float, -- bounciness factor
shape: Shape,
meta: a
}
Run Code Online (Sandbox Code Playgroud)
但这会使API更加笨拙,因为它会强制辅助函数采用额外的参数.是否有更优雅的方式来应对这种变化?
我正在尝试将 sbt 插件发布到本地文件存储库。在插件的 build.sbt 中我有:
publishTo := Some(Resolver.file("localtrix", file("/Users/jast/repo/localtrix")))
Run Code Online (Sandbox Code Playgroud)
我运行该publish任务,它被很好地发布到
/Users/jast/repo/localtrix/org/me/sbt-plugin_2.12_1.0/1.2.3
在另一个项目中,我想解决这个插件。在project/plugins.sbt我有:
resolvers += Resolver.file("localtrix", file("/Users/jast/repo/localtrix"))
addSbtPlugin("org.me" % "sbt-plugin" % "1.2.3")
Run Code Online (Sandbox Code Playgroud)
我尝试在这个项目中运行 sbt 并得到:
[info] Updating ProjectRef(uri("file:/Users/jast/playspace/untitled38/project/"), "untitled38-build")...
[warn] module not found: org.me#sbt-plugin;1.2.3
[warn] ==== typesafe-ivy-releases: tried
[warn] https://repo.typesafe.com/typesafe/ivy-releases/org.me/sbt-plugin/scala_2.12/sbt_1.0/1.2.3/ivys/ivy.xml
[warn] ==== sbt-plugin-releases: tried
[warn] https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/org.me/sbt-plugin/scala_2.12/sbt_1.0/1.2.3/ivys/ivy.xml/2017.2+4-3037ba82+20180314-1919/ivys/ivy.xml
[warn] ==== local: tried
[warn] /Users/jast/.ivy2/local/org.me/sbt-plugin/scala_2.12/sbt_1.0/1.2.3/ivys/ivy.xml
[warn] ==== public: tried
[warn] https://repo1.maven.org/maven2/org/me/sbt-plugin_2.12_1.0/1.2.3/sbt-plugin-1.2.3.pom
[warn] ==== local-preloaded-ivy: tried
[warn] /Users/jast/.sbt/preloaded/org.me/sbt-plugin/scala_2.12/sbt_1.0/1.2.3/ivys/ivy.xml
[warn] ==== local-preloaded: tried
[warn] file:////Users/jast/.sbt/preloaded/org/me/sbt-plugin_2.12_1.0/1.2.3/sbt-plugin-1.2.3.pom
[warn] ==== localtrix: tried
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] …Run Code Online (Sandbox Code Playgroud) 我克隆了仓库,并使用现有仓库,build.sbt将项目导入了Intellij(我不记得这样做时使用的设置)。我注意到Intellij该项目有一个自己web_3075的名称- 而我的项目名称是TestProject(name := "TestProject")。现在,当我尝试编译项目时,出现了错误Not a valid project ID: web_3075。我该如何解决这个问题?
我可以安全地删除.idea文件并再次导入项目吗?
我想更好地了解组织中工件之间存在冲突的依赖关系.为此,我创建了一个包含所有其他顶级项目的元项目.为了识别各种传递依赖的冲突,我的想法是使用冲突管理器.
我知道我可以设置这样的冲突管理器
conflictManager := ConflictManager.strict
Run Code Online (Sandbox Code Playgroud)
com.example包设置严格的管理器,并可能与其他更具体的管理器组合?我也很感谢有关解决这个问题的其他想法.
我试图在常春藤设置冲突管理器,但我找不到如何设置它们的具体示例.例如,要设置"严格"管理器,这会是什么样子?
<conflict-managers>
???
</conflict-managers>
Run Code Online (Sandbox Code Playgroud) 为了从linux服务器上的日志文件快速评估各种操作的时间,我想从日志中提取它们并创建textual/tsv样式直方图.为了更好地了解时间分布的方式,我想将它们分成0-10ms,10-20ms等范围.
输出应该如下所示:
121 10
39 20
12 30
7 40
1 100
Run Code Online (Sandbox Code Playgroud)
如何使用通常的unix命令行工具实现这一目标?
我想根据设置的值重新定义一个sbt任务.在默认情况下,它应该执行原始任务,在另一种情况下,我想运行自定义任务.
给定任务和设置:
val someSetting = Def.settingKey[Boolean]("some setting")
val fooTask = Def.taskKey[String]("foo task")
someSetting := true
fooTask := {
println("** foo effect **")
"foo value"
}
Run Code Online (Sandbox Code Playgroud)
试图重新定义fooTask:
fooTask := {
if( someSetting.value ) fooTask
else Def.task("whatever")
}.value
Run Code Online (Sandbox Code Playgroud)
给出编译错误:
build.sbt:39: error: Illegal dynamic dependency
if( someSetting.value ) fooTask
^
Run Code Online (Sandbox Code Playgroud)
使用Def.task任务编译......
fooTask := Def.task {
if( someSetting.value ) fooTask.value
else Def.task("whatever").value
}.value
Run Code Online (Sandbox Code Playgroud)
......但即使someSetting是假的也会被执行!
> set someSetting := false
[info] Defining *:someSetting
[info] The new value will be used by …Run Code Online (Sandbox Code Playgroud)