Ruby если только не логика - PullRequest
0 голосов
/ 06 марта 2020

Может кто-нибудь объяснить, пожалуйста, это поведение? Почему nil возвращает true, когда result = true if i, но возвращает false, когда result = false unless i

, если только снимок экрана не выполнен

def my_all?(pattern = nil)
result = true
my_each do |i|
  case pattern
  when nil
    p result, i
    result = false unless i
  when Regexp
    result = false unless i.to_s.match(pattern)
  when Class
    result = false unless i.is_a?(pattern)
  when String, Numeric
    result = false unless i == pattern   
  end
  result = yield(i) if block_given? && pattern.nil?
  break if !result
end
  result
end

если снимок экрана

def my_all?(pattern = nil)
    result = false
    my_each do |i|
      case pattern
      when nil
        p result, i
        result = true if i
      when Regexp
        result = true if i.to_s.match(pattern)
      when Class
        result = true if i.is_a?(pattern)
      when String, Numeric
        result = true if i == pattern   
      end
      result = yield(i) if block_given? && pattern.nil?
      break if !result
    end
    result
  end

1 Ответ

0 голосов
/ 09 марта 2020

Во втором примере, когда result установлен на true, ничто никогда не устанавливает его снова в false. Таким образом, если первое значение, полученное из my_each, является истинным, то метод my_all? вернет true.

Этот второй пример больше похож на реализацию any?, скорее чем all?. За исключением того, что это на самом деле только проверка первого элемента. Если первый i ложный, то l oop будет сломан и вернет false. Если первый i верен, то он будет установлен на true, и ничто не установит его обратно на false, и метод вернет `true.

См. Эти два примера, где единственная разница - значения, полученные с помощью my_each:

...