Ruby unless vs if 逻辑

Ruby unless vs if logic

有人可以解释一下这种行为吗?为什么当 result = true if i 时 nil return 为真,而当 result = false unless i

时 return 为假

unless case screenshot

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

if case screenshot

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

在您的第二个示例中,一旦 result 设置为 true,就不会再将其设置为 false。因此,如果 my_each 产生的第一个值是真值,那么 my_all? 方法将 return 为真。

第二个例子看起来更像是 any?, rather than all? 的一个实现。除了它实际上只检查第一个元素。如果第一个 i 是假的,那么循环就会被打破,它会 return 假。如果第一个 i 是真实的,那么它将被设置为 true 并且没有任何东西将它设置回 false,并且该方法将 return `true.

查看这两个示例,其中唯一的区别是 my_each:

产生的值