我们希望为三星Groovy SmartThings实现一个基础设施。当然,基础设施的主要部分是为每个设备实现不同的类及其相应的方法。例如,对于锁的设备,我们假设我们有一个带有lock()和unlock()方法的锁类。这里的问题是,在Groovy中的一个SmartThings应用程序中有这部分代码:
def presence(evt)
{
if (evt.value == "present") {
//Somecode
lock1.unlock()
}
else {
//Somecode
lock1.lock()
}
}因此,最有可能的情况是,lock1是类锁的对象,lock()和unlock()是该类的方法。事情是这样的:使用lock 1解锁()命令解锁门锁号#0,但使用lock 1解锁()命令解锁所有门锁。
这里的问题是类是如何创建的?如果lock1是一个对象列表,那么我们如何才能拥有一个类似lock1.lock()的命令。
这里的要点是,这两个对象应该具有相同的名称lock1,而且这两个方法都是名为lock()的相同方法。
提前谢谢你。
发布于 2019-06-19 00:05:26
你在这里有两个选择:
1)使用Groovy的list操作符对列表中的每个元素调用该方法:
List lock1 = [.....]
lock1.*lock()2)使Lock类扩展或包含元素列表,并向其添加类级方法:
class Lock {
List locks
def lock() {
locks.*lock()
}
// this method allows for calls like lock1[42].lock()
def getAt( int ix ) {
locks[ ix ]
}
}实际上,继承对IoT设备是不好的。
发布于 2019-06-19 07:56:00
这里要看到的“问题”是Groovy中的(隐式) 扩展算子。
表达式
cars*.make等效于cars.collect{ it.make }。当引用的属性不是包含列表的属性时,Groovy的GPath表示法允许一条捷径,在这种情况下它是自动传播的。在前面提到的情况下,可以使用表达式cars.make,但通常建议保留显式散点运算符。
(这里的例子提到了GPath,但列表、地图、.的情况也是如此。)
所以在这个例子中,lock1.unlock()是lock1*.unlock()。(动态) Groovy将看到,列表中没有unlock()方法,而只是扇出了。
至于“所以很可能,lock1是类锁的对象”,会给你带来噩梦。别猜了-找出答案。您可以通过println(lock1.inspect())获取详细信息,希望该类的作者有足够的远见添加一个有用的toString()方法。检查文档,函数返回的内容,您可以从其中分配locks1。使用工具,它告诉您类型(IDE,调试器,.)。
对于开发人员来说,这里更好的命名有助于:
// BAD naming
def locks1 = smartThings.getAll(Lock, clientId)
// better naming, add the type if it helps you or your IDE
Collection<Lock> allLocks = smartThings.getAll(Lock, clientId)现在,如果你打电话给allLocks.lock(),情况就更明显了。
为了防止隐式扩展操作符,可以在groovy脚本中使用静态编译。例如:
class Lock {
def lock() { println "lock" }
def unlock() { println "unlock" }
}
@groovy.transform.CompileStatic
class X {
public static main() {
[new Lock()].lock()
}
}这将不会编译:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
x.groovy: 9: [Static type checking] - Cannot find matching method java.util.List#lock(). Please check if the declared type is correct and if the method exists.
@ line 9, column 3.
[new Lock()].lock()
^
1 error使用显式扩展运算符([new Lock()]*.lock())编译。
https://stackoverflow.com/questions/56657876
复制相似问题