我正在尝试使用IntelliJ IDEA创建一个使用Gradle构建的新Kotlin项目(Ubuntu 16.04上的2016.2.5).当我这样做时,我立即收到错误消息.
这是我正在尝试的:
从欢迎屏幕中选择"创建新项目".
从左侧窗格中选择"Gradle",从右侧选择"Kotlin(Java)".点击下一步".
输入"hello-world"作为ArtifactId.点击下一步.
确保选择"从源集创建单独的模块"和"使用默认的Gradle包装器",没有别的.点击下一步".
使用项目名称和位置的默认值.单击"完成".
然后我立即得到这个错误:
Gradle 'hello-world' project refresh failed
Error: Could not find org.jetbrains.kotlin:kotlin-gradle-plugin:1.1-M02-12.
Searched in the following locations:
https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.1-M02-12/kotlin-gradle-plugin-1.1-M02-12.pom
https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.1-M02-12/kotlin-gradle-plugin-1.1-M02-12.jar
Required by:
:hello-world:unspecified
Run Code Online (Sandbox Code Playgroud)
生成的内容build.gradle如下所示:
version '1.0-SNAPSHOT'
buildscript {
ext.kotlin_version = '1.1-M02-12'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'kotlin'
repositories {
mavenCentral()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
Run Code Online (Sandbox Code Playgroud)
如何创建一个正确构建Gradle的Kotlin项目?
在创建数据类时,我经常发现我想要转换其中一个属性,通常是将其标准化或制作防御性副本.例如,在这里我想productCode永远是小写的:
data class Product(val productCode: String)
Run Code Online (Sandbox Code Playgroud)
我已经尝试添加一个init块,希望Kotlin足够聪明,让我手动处理构造函数参数赋值给属性:
data class Product(val productCode: String) {
init {
this.productCode = productCode.toLowerCase()
}
}
Run Code Online (Sandbox Code Playgroud)
但它将此视为重新分配.
我宁愿不用手写equals/ hashCode/ toString/ copyIDE生成的方法也不是真的好多了.
有没有办法转换数据类中的构造函数参数?
我javax.xml.stream.XMLStreamReader用来解析XML文档。不幸的是,我正在解析的某些文档使用非IANA编码名称,例如“ macroman”和“ ms-ansi”。例如:
<?xml version="1.0" encoding="macroman"?>
<foo />
Run Code Online (Sandbox Code Playgroud)
这将导致解析异常,并导致异常:
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,42]
Message: Invalid encoding name "macroman".
Run Code Online (Sandbox Code Playgroud)
有什么方法可以向我提供自定义编码处理程序,XMLStreamReader以便可以通过对所需编码的支持来增强它?
在ghci,我可以这样做:
ghci> (fmap . const) 5 [1,2,3,4,5]
[5,5,5,5,5]
Run Code Online (Sandbox Code Playgroud)
但如果我尝试将子表达式提取(fmap . const)到变量中,我会收到错误:
ghci> let foo = (fmap . const)
<interactive>:3:12:
No instance for (Functor f0) arising from a use of `fmap'
The type variable `f0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Functor ((,) a) -- Defined in `GHC.Base'
instance Functor ((->) r) -- Defined in `GHC.Base'
instance Functor IO -- Defined in `GHC.Base'
...plus two …Run Code Online (Sandbox Code Playgroud) 例如,如果我希望 shell 脚本能够获取 的值rootProject.name,我该怎么做?理想情况下,我想./gradlew使用一组参数进行调用,并将属性值(而不是其他值)打印到标准输出。
我们的团队有一个机器人,可以为我们的代码库的某些机械更改创建合并请求。我们希望这些 MR 在 CI 管道成功时自动合并,但我们的项目需要得到我们小组成员的批准。这意味着现在人类必须为每个机器人创建的 MR 手动单击“批准”和“合并”。显然 GitLab 没有办法为某些用户设置不同的批准规则,所以我还没有找到一种方法让机器人的用户不受此要求的影响。
我当前的想法是建立一个单独的流程来批准机器人创建的每个合并请求。有没有一种简单的方法可以以编程方式执行此操作?也就是说,是否有一个 API(或者更好的是命令行工具),当给定合并请求的分支名称时,它会批准与该分支关联的合并请求?
我也愿意接受其他方式,以最少的人为干预来实现这些变化。不过,我确实希望他们通过 CI 管道(目前这是通过让他们使用 MR 来完成的),并且 MR 在管道失败的极少数情况下也能提供帮助,因此我们可以调试出了什么问题。
如果重要的话:我们正在使用 gitlab.com,并且有一个“白银”计划。
我在这里达到了我的技能极限.我甚至不知道这是否可行 - 但我希望是这样.
我正在制作一个命令处理程序(文本).对于每个,Add()您可以指定所需参数的数量及其类型.例如:
void Add(string commandName, int requiredParameters, params Type[] paramTypes) { }
Add("test", 2, typeof(string), typeof(int));
Run Code Online (Sandbox Code Playgroud)
所以一个示例命令是:/test hello 7.命令处理程序检查以确保类型是正确的,例如,如果第二个参数不能转换为int,它将失败.
现在我遇到的问题是我想传递一个方法Add().(如果所有检查都通过,命令处理程序将调用此方法,并使用所需参数调用它).因此,所讨论的方法可以根据传入的内容包含任意数量的参数Add().
我该如何实现这一目标?代表不起作用抱怨参数不匹配.我尝试过这样的事情:
void Add<T1, T2>(..., Action<T1, T2> method) { }
Add(..., new Action<string, int>(cmd_MyMethod));
Run Code Online (Sandbox Code Playgroud)
但我必须为很多类型创建一个Add()方法.例如Add<T1, T2, T3, T4, etc>,它也使得输入调用变得很麻烦Add().
我不希望作为一个字符串传递给调用的方法,然后用this.GetType().GetMethod()得到它的句柄.虽然这种方式是理想的,但是当我进行模糊处理时它会变得混乱.
有谁知道有任何方法可以做到这一点?提前致谢.
我有代表流程中步骤的函数.每个函数也知道下一步,如果有的话.我希望能够做到这样的事情:
fun fooStep() : Step? {
... do something ...
return ::barStep // the next step is barStep
}
Run Code Online (Sandbox Code Playgroud)
这些函数是从中央调度函数调用的,它包含的代码有点像这样:
var step = startStep
while (step != null) {
step = step()
}
Run Code Online (Sandbox Code Playgroud)
请注意,特定步骤中的逻辑也决定了下一步,如果有的话.
我以为我可以定义Step为:
typealias Step = () -> Step?
Run Code Online (Sandbox Code Playgroud)
所以a Step是一个返回另一个的函数Step,或者为null.但是,这无法编译:
Kotlin: Recursive type alias in expansion: Step
Run Code Online (Sandbox Code Playgroud)
我可以通过将函数包装在一个对象中来解决这个问题.例如:
data class StepWrapper(val step: () -> StepWrapper?)
Run Code Online (Sandbox Code Playgroud)
并相应地更改我的功能签名.
不幸的是,这意味着我不能只使用函数文字(例如:) ::barStep,而是必须将它们包装在StepWrapper:
fun fooStep() : StepWrapper? {
... do something ...
return StepWrapper(::barStep) …Run Code Online (Sandbox Code Playgroud) 执行gradle这个应用程序插件的installDist任务创建一个目录,其中包含包装脚本,和.运行这些脚本中的任何一个都会运行应用程序,并且传递给这些脚本的参数将传递给底层应用程序.build/install/my-application-name/binmy-application-namemy-application-name.bat
在UNIX shell脚本中,您可以访问用于执行程序的名称$0.实际上,gradle生成的启动脚本的UNIX版本使用$0了几次.
如何配置gradle应用程序插件,以便这些脚本可以将$0(以及Windows上等效的Windows)的值传递到底层应用程序中,可能作为Java系统属性?
有时我们希望有一个挂起函数来调用事务内的其他挂起函数:
suspend fun mySuspendFunction(jooqContext: DSLContext) {
jooqContext.transaction { config ->
val transactionContext: DSLContext = config.dsl()
// ... some code that uses transactionContext ...
anotherSuspendFunction(transactionContext)
// ... more code that uses transactionContext ...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不会编译,因为 jOOQDSLContext.transaction采用非挂起函数作为其参数,因此事务主体无法直接调用挂起函数。上面的代码将无法编译,并出现如下错误:
挂起函数只能在协程体内调用
一种解决方法是使用runBlocking挂起调用:
suspend fun mySuspendFunction(jooqContext: DSLContext) {
jooqContext.transaction { config ->
val transactionContext: DSLContext = config.dsl()
// ... some code that uses transactionContext ...
runBlocking {
anotherSuspendFunction(transactionContext)
}
// ... more code that uses transactionContext ...
}
}
Run Code Online (Sandbox Code Playgroud)
然而,文档建议 …
kotlin ×4
gradle ×3
java ×2
.net ×1
c# ×1
data-class ×1
gitlab ×1
haskell ×1
jooq ×1
reflection ×1
stax ×1
xml-parsing ×1