Если утверждение и заявление Case - не совпадают - PullRequest
3 голосов
/ 25 сентября 2019

Почему оператор if работает, но оператор case не работает?

class A
end      # => nil

a= A.new  # => #<A:0x00007fd9d6134770>

If оператор работает

a.class == A  # => true

Case оператор не работаетработа

case a.class   # => A
when A
  puts "done"
else
  puts "else"  # => nil
end            # => nil

# >> else

Я читал, что оператор case использует === операторы вместо ==, как мне использовать == для оператора case?

1 Ответ

4 голосов
/ 25 сентября 2019

Форма case specific when archetype... всегда будет использовать проверку податливости archetype.===(specific).Чтобы использовать ==, вам нужно быть явным и использовать другую форму: case when boolean:

case
when a.class == A
  puts "done"
else
  puts "else"
end

Однако в этом конкретном случае (проверка, принадлежит ли объект в классе), есливам все равно, является ли a экземпляром A или экземпляром подкласса A (что почти всегда так), вы все равно можете использовать проверку подстановки, например:

case a         # Note: not a.class
when A
  puts "done"
else
  puts "else"
end

, потому что A === a, когда A является классом, во многом совпадает с a.is_a?(A).Обратите внимание, что это отличается от a.class == A, который не будет истинным, если a является экземпляром подкласса A.Например, для class Dog < Animal и fido = Dog.new оба значения fido.instance_of?(Animal) и fido.class == Animal имеют значение false, но оба значения fido.is_a?(Animal) и Animal === fido имеют значение true.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...