1

Samsung Groovy SmartThings のインフラストラクチャを実装したいと考えています。もちろん、インフラストラクチャの主要な部分は、対応するメソッドを使用して各デバイスに異なるクラスを実装することです。たとえば、ロックのデバイスの場合、メソッド lock() および unlock() を持つロック クラスがあると仮定しました。ここでの問題は、Groovy にある SmartThings アプリケーションの 1 つにコードのこの部分があることです。

def presence(evt)
{
    if (evt.value == "present") {
            //Somecode
            lock1.unlock()
    }
    else {
            //Somecode
            lock1.lock()
    }
}

おそらく、lock1 はロック クラスのオブジェクトであり、lock() と unlock() はそのクラスのメソッドです。ここに問題があります: lock1[0].unlock() コマンドを使用するとドアロック番号 #0 がロック解除されますが、lock1.unlock() コマンドを使用するとすべてのドアロックがロック解除されます。

ここでの質問は、クラスがどのように作成されるかということです。lock1 がオブジェクトのリストである場合、lock1.unlock() のようなコマンドを使用するにはどうすればよいでしょうか。

ここでのポイントは、両方のオブジェクトが同じ名前の lock1 を持つ必要があり、両方のメソッドが lock() という名前の同じメソッドであるということです。

前もって感謝します。

4

2 に答える 2

1

ここで見られる「問題」は、Groovyの (暗黙の)スプレッド演算子です。

cars*.makeは と同等cars.collect{ it.make }です。Groovy の GPath 表記では、参照されるプロパティが含まれるリストのプロパティではない場合にショートカットを使用できます。その場合、自動的に展開されます。前述のケースでは、式cars.makeを使用できますが、明示的なスプレッド ドット演算子を保持することが推奨されることがよくあります。

(そこの例は GPath について語っていますが、リスト、マップなどについても同じことが言えます...)

この場合もそうですlock1.unlock()lock1*.unlock()(動的) Groovy はunlock()、リストにメソッドがなく、ファン アウトするだけであることを確認します。

おそらく、ロック1はクラスロックのオブジェクトです」については、悪夢を与えるでしょう。推測しないでください - 調べてください。詳細についてはできますが、そのクラスの作成者が便利なメソッド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()) を使用すると、コンパイルが実行されます。

于 2019-06-19T07:56:00.507 に答える