首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在三星SmartThings应用程序中实现设备和传感器的类?

如何在三星SmartThings应用程序中实现设备和传感器的类?
EN

Stack Overflow用户
提问于 2019-06-18 22:35:15
回答 2查看 647关注 0票数 1

我们希望为三星Groovy SmartThings实现一个基础设施。当然,基础设施的主要部分是为每个设备实现不同的类及其相应的方法。例如,对于锁的设备,我们假设我们有一个带有lock()和unlock()方法的锁类。这里的问题是,在Groovy中的一个SmartThings应用程序中有这部分代码:

代码语言:javascript
复制
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()的相同方法。

提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-19 00:05:26

你在这里有两个选择:

1)使用Groovy的list操作符对列表中的每个元素调用该方法:

代码语言:javascript
复制
List lock1 = [.....]
lock1.*lock()

2)使Lock类扩展或包含元素列表,并向其添加类级方法:

代码语言:javascript
复制
class Lock {
  List locks

  def lock() {
    locks.*lock()
  }

  // this method allows for calls like lock1[42].lock()
  def getAt( int ix ) { 
    locks[ ix ] 
  } 
}

实际上,继承对IoT设备是不好的。

票数 0
EN

Stack Overflow用户

发布于 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,调试器,.)。

对于开发人员来说,这里更好的命名有助于:

代码语言:javascript
复制
// 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脚本中使用静态编译。例如:

代码语言:javascript
复制
class Lock {
    def lock() { println "lock" }
    def unlock() { println "unlock" }
}

@groovy.transform.CompileStatic
class X {
    public static main() {
        [new Lock()].lock()
    }
}

这将不会编译:

代码语言:javascript
复制
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())编译。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56657876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档