groovy/grailsの設定で作業していて、文字列値に対してswitch文を実行しようとするときに問題があります。文字列値をオンにするとGroovyで予期しない結果が発生する
基本的には、Webサービスの応答の属性名をループして、ユーザーごとに構成された定義済みのマッピングと一致するかどうかを確認しています。そのフィールドにマッピングが確立されている場合は、その値を応答から引き出し、別の場所で使用します。
コードはこのようなものになります
switch(attributeName)
{
case {attributeName} :
log.info("Currently switching on value... ${attributeName}")
case user.getFirstNameMapping():
model.user.userInfo.firstName = attributeValue
break
case user.getLastNameMapping():
model.user.userInfo.lastName = attributeValue
break
case user.getAuthenticationKeyMapping():
model.authenticationValue = attributeValue
break
case user.getEmailMapping():
model.email = attributeValue.toLowerCase()
break
}
(attributeNameの)オンされる値はString型で、ユーザーインスタンスのゲッター方法はまた、String型を返します。
Groovy言語についての私の研究と理解に基づいて、StringなどのObjectの切り替えは、String.equals()を使用して比較を行う必要があります。しかし、その結果、毎回user.getFirstNameMapping()のケースで一致し、モデルの値を繰り返し上書きしてしまいます。したがって、応答に返される最後の値は保存されたもので、他の値は保存されません。
if(attributeName.equals(user.getFirstNameMapping())
{
...
}
それは罰金たびに動作します:面白い何
は、私がもし/他の構造を使用して、このような何かを行う場合ということです。私はそれが余分な空白や大文字の問題のような愚かではないことを記録を通して検証しました。
switch(true)
{
case {attributeName} :
log.info("Currently switching on value... ${attributeName}")
case {user.getFirstNameMapping().equals(attributeName)}:
model.user.userInfo.firstName = attributeValue
break
case {user.getLastNameMapping().equals(attributeName)}:
model.user.userInfo.lastName = attributeValue
break
case {user.getAuthenticationKeyMapping().equals(attributeName)}:
model.authenticationValue = attributeValue
break
case {user.getEmailMapping().equals(attributeName)}:
model.email = attributeValue.toLowerCase()
break
}
そしてそれはまだ正確に同じように私の期待を満たしていない:私はまた、デフォルトでスイッチを実行して、明示的にこのような場合にはattributeNameと比較するために周りのものを変更しようとしました。だから、なぜ私は文字列を比較するために、switch文が単に.equals()を使うべきか、ifequential()を使ってif/elseを明示的に比較するときに、これが動作であると思っています。
場合{attributeNameが}たびに実行され、あなたが見れば第二の場合もそれとするたびに実行し、それになるような問題は、uはスイッチケースを使用した方法でGrailsのでは問題ではありません中断するので、スイッチが起動する前に{attributeName}の値を表示してください。 –