Determinar o tipo de um objecto em ruby

vou usar python como exemplo do que estou à procura (pode pensar nele como pseudocódigo se não conhece Python):

>>> a = 1
>>> type(a)
<type 'int'>

sei que em ruby posso fazer:

1.9.3p194 :002 > 1.class
 => Fixnum 
Mas esta é a maneira correcta de determinar o tipo do objecto?

 268
Author: Yuxuan Chen, 2013-04-02

4 answers

A forma correcta de determinar o "tipo" de um objecto, que é um termo oscilante no mundo do rubi, é chamar object.class.

, uma vez que as classes podem herdar de outras classes, se você quiser determinar se um objeto é "de um determinado tipo" você poderia chamar de object.is_a?(ClassName) para ver se object é do tipo ClassName ou derivado dele.

Normalmente a verificação do tipo não é feita em Ruby, mas em vez disso os objectos são avaliados com base na sua capacidade de responder a métodos específicos, vulgarmente chamados " Duck dactilografia ". Em outras palavras, se ele responde aos métodos que você quer, não há razão para ser particular sobre o tipo.

Por exemplo, object.is_a?(String) é demasiado rígido uma vez que outra classe pode implementar métodos que o convertam numa cadeia, ou fazê-lo comportar-se de forma idêntica à forma como a cadeia se comporta. Seria melhor testar se o objecto em questão faz o que quer.

 452
Author: tadman, 2017-11-10 21:10:44
Também podes tentar.: instance_of?
p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True
 55
Author: Arup Rakshit, 2013-04-02 17:03:58
Muitas vezes em Ruby, você não se importa com a classe do objeto, por si só, você só se importa que ele responda a um determinado método. Isto é conhecido como datilografia de patos e você vai vê-lo em todos os tipos de codebases de Ruby.

Em muitos casos (se não na maioria), é melhor usar a datilografia de patos usando #respond_to?(method):

object.respond_to?(:to_i)
 34
Author: Stuart M, 2013-04-02 16:56:01
Eu diria "sim". Como "Matz" tinha dito algo assim em uma de suas palestras, "Objetos Ruby não têm tipos." Não tudo, mas a parte que ele está a tentar passar para nós. Porque é que alguém diria "Tudo é um objecto", então? Para adicionar ele disse que "dados tem tipos Não objetos". Então, talvez gostemos disto.

Https://www.youtube.com/watch?v=1l3U1X3z0CE

Mas a Ruby não se importa muito com o tipo de objecto, apenas com a classe. Nós usamos classes não tipo. Todos os dados, então, tem uma classe.
12345.class

'my string'.class

Eles também podem ter antepassados

Object.ancestors
Eles também têm aulas de meta, mas vou poupar-te os detalhes. Assim que conheceres a turma, poderás procurar os métodos que podes usar para ela. É aí que o" tipo de dados " é necessário. Se queres mesmo entrar em detalhes, procura...

"The Ruby Object Model"

Este é o termo usado para como Ruby lida com objetos. É tudo interno para que não vejas muito disto, mas é bom saber. Mas isso é outro tópico. Sim! A classe é o tipo de dados. Os objetos têm classes e os dados têm tipos. Então se você sabe sobre bases de dados então você sabe que há apenas um conjunto finito de tipos.

Blocos de texto números

 7
Author: Douglas G. Allen, 2017-05-26 21:18:41