Vou usar python como um exemplo do que estou procurando (você pode pensar nisso como pseudocódigo, se não conhece o Python):
>>> a = 1
>>> type(a)
<type 'int'>
Eu sei em ruby que posso fazer:
1.9.3p194 :002 > 1.class
=> Fixnum
Mas esta é a maneira correta de determinar o tipo do objeto?
isinstance
ou procuraria por respostas. Mas simplesmente dizendo "NÃO !!!" não é realmente útil, agora, é? Em vez disso, considere ser educacional.Respostas:
A maneira correta de determinar o "tipo" de um objeto, que é um termo vacilante no mundo Ruby, é chamar
object.class
.Como as classes podem herdar de outras classes, se você deseja determinar se um objeto é "de um tipo específico", você pode ligar
object.is_a?(ClassName)
para ver seobject
é do tipoClassName
ou é derivado dele.Normalmente, a verificação de tipo não é feita no Ruby, mas os objetos são avaliados com base em sua capacidade de responder a métodos específicos, comumente chamados de " digitação de pato ". Em outras palavras, se ele responder aos métodos desejados, não há razão para ser específico sobre o tipo.
Por exemplo,
object.is_a?(String)
é muito rígido, já que outra classe pode implementar métodos que a convertem em uma string ou fazer com que ela se comporte de maneira idêntica à maneira como a String se comporta.object.respond_to?(:to_s)
seria uma maneira melhor de testar se o objeto em questão faz o que você deseja.fonte
#class
se não retornar o tipo do objeto, ele retorna a sua classe . O nome deve ser uma oferta inoperante. Classe e Tipo são dois conceitos completamente diferentes no OO.typeof
de C, JavaScript e outras éclass
. Não existe um sistema formal de protocolo em Ruby, como em outros idiomas, o Objective-C é o parente mais próximo do Smalltalk. Se você está definindo "tipo" como "objeto que responde a um conjunto específico de métodos com resultados aceitáveis", não há realmente nenhuma maneira de afirmar isso. É muito solto. Na maioria das vezes em Ruby, quando se refere ao tipo de um objeto, entende-se que você está falando sobre a classe. Eu usei o termo type entre aspas por esse mesmo motivo.int i
" ou "Integer j
".) Tadman respondeu à pergunta de uma maneira que parecia satisfazer tanto o questionador e o público em geral, esclarecendo a terminologia que Ruby usa. Não tenho interesse em dividir o cabelo acadêmico sobre os pontos mais delicados da terminologia orientada a objetos; portanto, tenha a última palavra.você também pode tentar:
instance_of?
fonte
Muitas vezes, em Ruby, você realmente não se importa com a classe do objeto, por si só, apenas se importa com a resposta a um determinado método. Isso é conhecido como Duck Typing e você verá em todos os tipos de bases de código Ruby.
Portanto, em muitos casos (se não na maioria), é melhor usar o Duck Typing usando
#respond_to?(method)
:fonte
Eu diria "sim". Como "Matz" havia dito algo assim em uma de suas palestras, "objetos Ruby não têm tipos". Nem tudo, mas a parte que ele está tentando nos transmitir. Por que alguém teria dito "Tudo é um Objeto" então? Para adicionar, ele disse: "Os dados têm tipos, não objetos".
Então, podemos aproveitar isso.
https://www.youtube.com/watch?v=1l3U1X3z0CE
Mas Ruby não se importa muito com o tipo de objeto, apenas a classe. Usamos classes, não tipos. Todos os dados têm uma classe.
Eles também podem ter antepassados
Eles também têm meta-classes, mas eu vou salvar os detalhes sobre isso.
Depois de conhecer a classe, você poderá pesquisar quais métodos você pode usar para ela. É aí que o "tipo de dados" é necessário. Se você realmente quer entrar em detalhes, procure ...
"O modelo de objeto Ruby"
Este é o termo usado para como o Ruby lida com objetos. É tudo interno, então você realmente não vê muito disso, mas é bom saber. Mas esse é outro tópico.
Sim! A classe é o tipo de dados. Os objetos têm classes e os dados têm tipos. Portanto, se você conhece as bases de dados, sabe que há apenas um conjunto finito de tipos.
blocos de texto números
fonte
Object.ancestors # => [Object, Kernel, BasicObject]