Qual é a diferença entre
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
e
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
Por alguma razão, o primeiro deles funciona às vezes e o segundo não, e outras vezes, o segundo funciona e o primeiro não. Por quê? Qual é a maneira "correta" de fazer isso?
ruby
duck-typing
case-statement
Daisy Sophia Hollman
fonte
fonte
MyClass === obj
usa o método Module # === para verificar seobj
é uma instância deMyClass
.Respostas:
Você deve usar:
Eu tive o mesmo problema: Como pegar a classe Errno :: ECONNRESET em "case when"?
fonte
Sim, Nakilon está correto, você deve saber como o operador threequal === funciona no objeto fornecido na
when
cláusula. Em Rubyé realmente
Entenda que o caso está chamando um método threequal (
MyClass.===(item)
por exemplo) e esse método pode ser definido para fazer o que você quiser e, em seguida, você pode usar a instrução case com precisionwfonte
arr = []
, notei queif Array === arr
avaliará como verdadeiro, masif arr === Array
avaliará como falso. Alguém por favor pode ajudar a explicar?Você pode usar:
... quando a seguinte torção não for possível:
A razão para isso é que os
case
usos===
e o relacionamento que o===
operador descreve não são comutativos . Por exemplo,5
é umInteger
, mas éInteger
um5
? É assim que você deve pensar emcase
/when
.fonte
No Ruby, um nome de classe é uma constante que se refere a um objeto do tipo
Class
que descreve uma classe específica. Isso significa que dizerMyClass
em Ruby é equivalente a dizerMyClass.class
em Java.obj.class
é um objeto do tipo queClass
descreve a classe deobj
. Seobj.class
forMyClass
, entãoobj
foi criado usandoMyClass.new
(grosso modo).MyClass
é um objeto do tipoClass
que descreve qualquer objeto criado usandoMyClass.new
.MyClass.class
é a classe doMyClass
objeto (é a classe do objeto do tipoClass
que descreve qualquer objeto criado usandoMyClass.new
). Em outras palavrasMyClass.class == Class
,.fonte
Depende da natureza da sua
item
variável. Se for uma instância de um objeto, por exemploentão
mas se é uma classe em si mesma, por exemplo
então será um
Class
objeto, entãoEDIT : consulte a seção Como capturar a classe Errno :: ECONNRESET em "case when"? como afirmado por Nakilon, pois minha resposta pode estar errada.
fonte