我想具有扩展功能并使用kotlin-logging中的记录器,并在随播对象中具有常量。
我的功能:
fun String.toFoo(): Foo {
logger.debug { "Mapping [$this] to Foo" }
if(MY_CONST.equals(this) {
...
}
问题是我应该放在val logger = KotlinLogging.logger {}
和MY_CONST
的地方,因为我不能将伴随对象与扩展功能一起使用?
答案 0 :(得分:2)
如果只希望记录器为单例,则可以创建一个包含记录器及其实例的对象,然后从那里访问它。
Object LoggerSingleton( val logger = KotlinLogging.logger{})
然后在您的扩展功能中
fun String.toFoo(): Foo {
LoggerSingleton.logger.debug { "Mapping [$this] to Foo" }
if(MY_CONST.equals(this) {
}
由于Kotlin中的一个对象保证只有一个实例,因此每次使用toFoo时都不会使用不同的记录器。
编辑 保留所需的班级名称 Use this signature 像这样:
Object StringLoggerSingleton( val logger = KotlinLogging.logger("String"))
答案 1 :(得分:0)
我不知道您想用记录器完成什么,但是我向您展示了我已经做过的事情;-)
通常,我将扩展函数放在其自己的文件中,该文件的名称类似于该函数实际扩展的文件(例如,var input1 = $(".input1").val();
var input2 = $(".input2").val();
var score1 = $("#score1").val();
var score2 = $("#score2").val();
var sumproduct = (parseFloat(input1) * parseFloat(score1)) + (parseFloat(input2) * parseFloat(score2));
var unit = 0.50;
var sumproduct = sumproduct.toFixed(2);
var remainder = parseFloat(sumproduct) % parseFloat(unit);
var mround = (parseFloat(remainder) < parseFloat(unit)/2) ? parseFloat(sumproduct) - parseFloat(remainder) : parseFloat(sumproduct) + (parseFloat(unit) - parseFloat(remainder));
var mround = String(mround.toFixed(2));
$('#total_score').val(mround);
// console.log(input1);
// console.log(input2);
// console.log(score1);
// console.log(score2);
// console.log(sumproduct);
// console.log(mround);
,或者与其用途更相关,并且可能仅在某些依赖项可用时才可用,我也做了之类的东西,例如StringExtensionFunction
(其中有JsoupExtensionFunctions
,String.toJsoupHtml()
等)。
如果我随后需要常量,则可以将它们放在该文件中,例如只需编写如下内容:
File.toJsoupXml()
没有private const val MY_CONST = "my_const_value"
,没有class
。
关于object
...,因为记录器通常与某个名称/类相关联,所以我通常在每个(重要)类中都放置一个记录器,或者将某些记录器与特定名称相关联...所以我不是完全确定您的意图是...如果记录程序可以返回扩展函数的容器(也许是logger
),那么您还可以将logger-val放在该文件中,类似于我和StringExtensionFunction.kt
一起出现。
如果您打算重用调用方记录器,则可能不太容易...(然后最简单的方法是将其传递给函数,但通常您不希望这样做)...以及其他机制可能并不真正值得;-)