2013-12-02 4 views
0

Этот код немного глуп, но он представляет проблему полностью. Две карты разные, но true всегда возвращается. Почему это происходит?Логический метод в groovy всегда возвращает true

class SampleTest { 

    private static boolean compare() { 
     def a = [a:'one',b:'two'] 
     def b = [c:'three',d:'four'] 

     if(a.size()!=b.size()) { 
      return false 
     } 
     a.each { 
      if(!a.equals(b)){ 
       return false 
      } 
     } 
     return true 
    } 
    static main(args) { 
     println SampleTest.compare() 
    } 

} 

Если добавить дополнительную переменную, то все работает отлично:

class SampleTest { 

    private static boolean compareArtifact() { 
     boolean areEqual = true 
     def a = [a:'one',b:'two'] 
     def b = [c:'three',d:'four'] 

     if(a.size()!=b.size()) { 
      return false 
     } 
     a.each { 
      if(!a.equals(b)){ 
       areEqual = false 
      } 
     } 
     areEqual 
    } 
    static main(args) { 
     println SampleTest.compareArtifact() 
    } 

} 

ответ

1

Вы вызываете возвращения из внутри закрытия each

Это будет просто выйти закрытие, но не вернется из прилагаемая функция

Вы можете использовать find в качестве раннего контура завершения и проверить результат для нуля

private static boolean compare() { 
    def a = [a:'one',b:'two'] 
    def b = [c:'three',d:'four'] 

    if(a.size() != b.size()) { 
     return false 
    } 
    return a.find { a != b } == null 
} 

Или return a == b делает то же самое, как ваш метод сравнения

+0

Хорошо, но как я могу уйти от метода (возвращать ложь) в каждом закрытии? Вышеприведенный пример намеренно сконструирован и предназначен только для того, чтобы проявлять разливы. Могу ли я сказать Groovy, чтобы он возвращал оператор не для закрытия корня, а для всего метода? – Xelian

+0

@Xelian Но каков ваш код, который должен вернуться? Вы сравниваете 'a' с' b', но 'a' будет' MapEntry', а 'b' будет' Map' в вашем примере выше (так никогда не будет 'true'). Я добавил пример использования 'find' для моего ответа, надеюсь, что это поможет - хотя у него все еще будет проблема, что он никогда не вернет' true' –

+0

Ok для __find__, но 'a' - это Map и 'b' карта тоже. Я не сравниваю это в a.each, а всю карту a. SO, если a.equals (b) true должно быть возвращено. Поэтому, чтобы спросить по-другому, если мы так закрыты, как мы можем избежать этого метода, а остальная часть метода не будет выполнена. Как в java, если мы нажмем на возврат, остальная часть кода пропущена? Можем ли мы сделать это в Groovy? – Xelian

Смежные вопросы