Этот код немного глуп, но он представляет проблему полностью. Две карты разные, но 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()
}
}
Хорошо, но как я могу уйти от метода (возвращать ложь) в каждом закрытии? Вышеприведенный пример намеренно сконструирован и предназначен только для того, чтобы проявлять разливы. Могу ли я сказать Groovy, чтобы он возвращал оператор не для закрытия корня, а для всего метода? – Xelian
@Xelian Но каков ваш код, который должен вернуться? Вы сравниваете 'a' с' b', но 'a' будет' MapEntry', а 'b' будет' Map' в вашем примере выше (так никогда не будет 'true'). Я добавил пример использования 'find' для моего ответа, надеюсь, что это поможет - хотя у него все еще будет проблема, что он никогда не вернет' true' –
Ok для __find__, но 'a' - это Map и 'b' карта тоже. Я не сравниваю это в a.each, а всю карту a. SO, если a.equals (b) true должно быть возвращено. Поэтому, чтобы спросить по-другому, если мы так закрыты, как мы можем избежать этого метода, а остальная часть метода не будет выполнена. Как в java, если мы нажмем на возврат, остальная часть кода пропущена? Можем ли мы сделать это в Groovy? – Xelian