【问题标题】:Passing a def variable to a typed BigDecimal argument in Groovy将 def 变量传递给 Groovy 中的类型化 BigDecimal 参数
【发布时间】:2016-03-29 09:17:58
【问题描述】:

我是 Groovy 的新手,所以我对语言的运行时绑定、类型化和非类型化属性有点困惑。我个人更喜欢声明类型。

不过,我有一个问题。

我有一个小方法,它从地图、输入等中获取一些变量,我知道这些变量是数字。假设我不知道初始类型是什么(它位于代码深处或来自外部源),除此之外它是一个数字。现在我有一个方法可以接受其中两个参数,我必须对它们进行模运算。因为它们可能是十进制或不是十进制,所以我使用 BigDecimal 的其余部分编写了一个小方法,因此为了强制执行类型,我在方法签名上使用了 BigDecimal 类型。

def callerMethod(Map map) {
    ...
    map.each{
        calledMethod(it.val1, it.val2)
        ...
    }
    ...
}

def calledMethod(BigDecimal val1, BigDecimal val2) {
    ...
    vl1.remainder(val2)
    ...
}

这是正确的吗?如果传入的参数是 Integer(如果我理解正确,大多数情况下原语都是装箱的),它会被隐式转换还是变成 BigDecimal?

这在 Groovy 中是如何工作的。

我仍然认为,既然我可以选择使用类型,我想使用它们而不是声明所有内容。如果您阅读已经存在的代码,它还可以更轻松地阅读代码或查看内容

【问题讨论】:

  • 不要将所有内容都声明为def...如果您知道类型,请声明类型,尤其是在您的公共接口上
  • map.each{ calledMethod(it.val1,it.val2)} 没有意义。您能否在您的问题中添加输入示例(地图?)以及输出示例?

标签: groovy types


【解决方案1】:

这个方法的问题不是变量的类型,是你的每个映射

在 groovy Map 中,每个都有两个签名。 一个接收一个 Map.Entry 参数,另一个接收键和值

例如:

Map map = [key1:'value1',key2:'value2']
map.each{ Map.Entry entryMap ->
    println "The value of key: ${entryMap.key} is ${entryMap.value}"
}

每个结果都会是:

The value of key: key1 is value1
The value of key: key2 is value2

也可以这样

Map map = [key1:'value1',key2:'value2']
map.each{ def key, def value ->
    println "The value of key: ${key} is ${value}"
}

第二个的结果与第一个相同。

如果您想将两个特定参数传递给您调用的方法,请在每个外部都传递,如下所示:

def callerMethod(Map map) {
    calledMethod(map.val1, map.val2)
}

我不完全理解你想要什么。我希望这对你编写代码有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2014-04-03
    • 2017-05-24
    • 2010-12-10
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多