Целью этого фрагмента кода (его частью более крупного кода) является определение того, имеет ли год в нем дублирующиеся номера. Вот мой код:Почему мои результаты испортили мои результаты?
def no_repeat?(year)
year = year.to_s
string = ''
year.each_char{|i| string << year[i] unless string.include?(year[i])}
year.length == string.length ? (return false) : (return true)
end
puts no_repeat?(1993)
Это ВСЕГДА возвращает true, и я не могу понять, почему это происходит. Я попытался расширить тернар в полный оператор if ... по-прежнему возвращает true. Я пытался писать весь этот метод, как цикл While (с двумя индексами, которые сравнивают один индекс к другой)
def no_repeat?(year)
year = year.to_s
i = 0
while i < year.length
i2 = i + 1
while i2 < year.length
if year[i] == year[i2]
return false
else
return true
end
i2 += 1
end
i += 1
end
... до сих пор возвращает истину. Я тестировал каждую вещь самостоятельно, и все они отлично работают, пока я не вернусь. Что это касается возвратов? Мне нужны свежие глаза.
да, each_char оценивает символы сами по себе, лол, я не могу поверить, что я не расслышал когда я действительно знал это, я так привык писать в цикле (пытаясь вырваться из этого), где вам нужно отличить [i] от объекта [i] ....в этом случае я хочу, чтобы метод возвращал true, если нет повторений, а false, если есть, и именно поэтому, если i == i2, то там будет повторение, поэтому первое возвращение было ложным. В целом, ваше предложение опустить истинные ложные возвращения все вместе сработало !! снова, почему я не подумал об этом?! tuh! Я все еще новичок, lol, спасибо! – HolyMoly
но быстро, действительно ли имеет значение, какой заказ вы положили return true/false до тех пор, пока это результат, который вы хотите для условия проверки? как я? Рубин читает их только в определенном порядке? Я действительно экспериментировал с их переключением, и он продолжал возвращать ложь, казалось, что он пропускал первое возвращение независимо (как в тройном, так и в цикле while). Почему? – HolyMoly
Это имеет значение. Результат, если условие истинно, должен быть помещен первым, и поэтому, если вы хотите инвертировать то, что вы поместили бы 'false' сначала (после'? '). Если вы все время получали ложные результаты, я еще не уверен в этой причине, но это может быть странность с возвращаемыми выражениями _inside_ trernary, а не в результате тройной. В цикле while я не экспериментировал с вашим кодом, чтобы увидеть, как это себя ведет. Важно использовать тернарные выражения для возврата или назначения как 'var = bool_expression? val_if_true: val_if_false', а не пытаться поместить в него 'return' –