【发布时间】:2019-12-05 17:54:20
【问题描述】:
我是 Groovy 的新手,我正在尝试使用闭包和 .& 方法指针运算符。
为了进一步了解 Groovy 的工作原理,我设置了以下示例。
我预计isString 的所有 3 个版本都会返回 true - 但是 isString3 会抛出 MethodMissingException,我不确定我是否理解 isString2 和 isString3 之间的实际区别是什么导致异常。
string = 'foo'
isString = {it instanceof String}
println isString(string) // true
// let's try it a different way
isString2 = {String.isInstance(it)}
println isString2(string) // true
// let's try using .& for fancy FP eta reduction
isString3 = String.&isInstance
println isString3(string) // MethodMissingException
// ^^^ No signature of method: java.lang.String.isInstance()
// is applicable for argument types:
// (java.lang.String) values: [foo]
// EDIT: Case #4
// what if we try a method we know does not exist?
isNotString = String.&isNotInstance
println isNotString(string) // MethodMissingException
// ^^^ gives the same error!
// EDIT: Case #5
// Maybe I am misunderstanding how the .& operator works - let's try an example
bar = 'bar'
equalsBar = bar.&equals
println equalsBar('bar') // true - same as 'bar'.equals('bar')
println equalsBar('baz') // false - same as 'bar'.equals('baz')
// the .& operator has worked as expected in this case
我尝试在 SO 周围搜索其他答案,但没有真正找到解释我在这里看到的实际差异的答案。
【问题讨论】:
-
def tmp = java.lang.String.&isInstance -
@DaveNewton 做出这种改变似乎并没有改变我所看到的行为。
-
这对我来说是零星的,我不知道为什么——为了格式化,我会在答案中显示我的 groovysh 输出。
-
isInstance来自“类”类,equals来自对象类。那里可能有一些不同。