[RAILS] [Ruby] Peut-être que vous ne comprenez pas vraiment? [Différence entre la classe et le module]

Bonjour Ichihara.

Avant

"Je l'utilise souvent dans des applications créées avec Rails ** Je souhaite mettre mes propres méthodes dans un fichier séparé et les utiliser si nécessaire **, mais je ne sais pas comment faire ..."

Il y avait une telle chose. Je n'ai pas compris ** classe et module **, qui semblaient étonnamment connus, alors je les ai résumés dans un article.

classe et module

En gros, ça ressemble à ça.

Fonctionnalité comment utiliser Héritage exemple Supériorité
class Une collection de données et de méthodes Lisez le fichier avec require, puis héritez et utilisez-le comme méthode d'instance Étant donné que plusieurs classes sont regroupées à l'aide de l'héritage, il peut être utilisé comme un framework.
module Une collection de méthodes et de valeurs uniquement Lisez le fichier avec reequire puis incluez,Utilisé en extension Collectez des données et utilisez-les si nécessaire, utilisez-les en tant que partie

class

La classe affecte une plus large gamme d'objets par héritage et instanciation.

python


class Formula
  def pythagorean_theorem(a, b)
    p "c = #{Math::sqrt(a**2+ b**2)}"
  end

  def self.quadratic_formula(a, b, c)
    x1 = (- b +Math::sqrt(b*b -4*a*c))/ 2 * a
    x2 = (- b -Math::sqrt(b*b -4*a*c))/ 2 * a
    p "x is #{x1} and #{x2}"
  end
end


calc/calculate.rb


#Lisez d'abord le fichier en utilisant require
require "calc/formulas"

#Hériter des classes et hériter des méthodes et des données
class Hoge < Formula

  attr_accessor :name

  def initialize(name, age)
    @name = name
    @age = age
  end

end

hoge = Hoge.new("hogehoge",22)
hoge.pythagorean_theorem(3, 4)

#-----------------------------------------------------------

"c = 5.0"

Dans le cas d'une classe, commencez par lire le fichier en utilisant ** require **, laissez la classe que vous souhaitez utiliser ** inherit **, puis ** créez une instance **.

Par conséquent, il convient ** pour hériter de nombreuses données telles que la construction de modèles et de frameworks MVC et de se lier les uns aux autres **, mais si vous souhaitez l'utiliser lorsque vous souhaitez utiliser les données ensemble, cela sera décrit plus tard. On peut dire que ** module ** est plus adapté.

module

Les modules ont également le rôle de regrouper les mêmes valeurs et méthodes que la classe, mais ** ne peuvent pas créer et hériter d'instances **.

Par conséquent, le module est plus facile à utiliser que la classe en termes de simple collecte d'informations et de les appeler là où c'est nécessaire.

Il existe deux types de modules d'appel dans la classe, ** include et extend **.

inclure et étendre

En un mot, incluez le module embeds comme ** méthode d'instance ** et étendez le module embeds comme ** méthode de classe **.

Ci-dessous, ** les formules mathématiques sont résumées sous forme de module et appelées comme méthode d'instance. ** **

calc/formulas.rb


module Formula

 #Théorème des trois carrés
  def pythagorean_theorem(a, b)
    p "c = #{Math::sqrt(a**2+ b**2)}"
  end


  #Formule de la solution
  def quadratic_formula(a, b, c)
    x1 = (- b +Math::sqrt(b*b -4*a*c))/ 2 * a
    x2 = (- b -Math::sqrt(b*b -4*a*c))/ 2 * a
    p "x is #{x1} and #{x2}"
  end

end

calc/calculate.rb


#Lis
require "calc/formulas"

class Hoge

  attr_accessor :name
  
  #Utiliser inclure en classe
  include Formula

  def initialize(name, age)
    @name = name
    @age = age
  end

end


hoge = Hoge.new("hogehoge",22)
hoge.pythagorean_theorem(3, 4)

#---------------------------------------------------

"c = 5.0"

De cette manière, l'instance générée à partir de la classe Hoge peut utiliser pythagorean_theorem, qui est le théorème de Pitagoras, comme une ** méthode d'instance **.

Ensuite, quand je l'ai lu de la même manière avec extension ...

python


require "calc/formulas"

class Hoge
  attr_accessor :name

  extend Formula

  def initialize(name, age)
    @name = name
    @age = age
  end

  def hello
    p "Hello! I'm #{@name} "
    p "I'm #{@age} old"
  end

end

hoge = Hoge.new("hogehoge",22)
hoge.pythagorean_theorem(3, 4)

#--------------------------------------------------------------------

calculate.rb:26:in `<main>': undefined method `pythagorean_theorem' for #<Hoge:0x000000000504a3a8 @name="hogehoge", @age=22> (NoMethodError)

Et vous pouvez voir que l'instance générée ne peut pas utiliser la méthode du module.

python


Hoge.pythagorean_theorem(3, 4)

#----------------------------------------------------------------

"c = 5.0"

Vous pouvez l'utiliser en l'appelant comme une ** méthode de classe **.

À propos, puisque le module est développé dans la classe, la méthode d'instance et la méthode de classe peuvent être utilisées dans la classe qui en hérite **, respectivement.

Les éléments suivants ont hérité de la classe utilisant include.

python



class Fuga < Hoge

end


fuga = Fuga.new("fugafuga",20)
fuga.quadratic_formula(1, 3, 2)

#----------------------------------------------------------------
"x is -1.0 and -2.0"

méthode du module

Si vous souhaitez utiliser uniquement la méthode ** directement sans l'incorporer dans la classe, vous pouvez utiliser la ** méthode module **.

python


module Formula

  def pythagorean_theorem(a, b)
    p "c = #{Math::sqrt(a**2+ b**2)}"
  end

  def quadratic_formula(a, b, c)
    x1 = (- b +Math::sqrt(b*b -4*a*c))/ 2 * a
    x2 = (- b -Math::sqrt(b*b -4*a*c))/ 2 * a
    p "x is #{x1} and #{x2}"
  end
 
 # module_function +Définir la méthode du module par le nom de la méthode
  module_function :quadratic_formula

end

python


#Peut être appelé de la même manière qu'une méthode de classe
Formula.quadratic_formula(1, 8, 12)

#---------------------------------------------------

"x is -2.0 and -6.0"

Comme vous pouvez le voir, le module n'est pas nécessaire tant que la ** classe n'est pas créée, mais il peut être utilisé si vous souhaitez ajouter une petite fonction **.

Résumé

Il est préférable d'utiliser le module si vous souhaitez simplement organiser les données et la classe si vous souhaitez incorporer les données dans une partie de l'application à l'aide de l'héritage.

Recommended Posts

[Ruby] Peut-être que vous ne comprenez pas vraiment? [Différence entre la classe et le module]
Facile à comprendre la différence entre la méthode d'instance Ruby et la méthode de classe.
Différence entre classe et instance
Différence entre la méthode d'instance et la méthode de classe
Différence entre interface et classe abstraite
[Ruby] Différence entre is_a? Et instance_of?
Différence entre la variable d'instance et la variable de classe
Remarque: Différence entre Ruby "p" et "met"
Différence entre la variable d'instance Ruby et la variable locale
Différence entre "|| =" et "instance_variable_defined?" Dans Ruby memo
[Ruby] Différence entre print, put et p
[Java] Comprendre la différence entre List et Set
[iOS] Comprendre la différence entre le cadre et les limites
Comprenez la différence entre les classes abstraites et les interfaces!
[Ruby] Différence entre les put et les retours, les valeurs de sortie et de retour
[Ruby] J'ai réfléchi à la différence entre each_with_index et each.with_index
Différences entre les classes et les instances dans Ruby
Différence entre Spring AOP et la classe cible de la bibliothèque
Différence entre vh et%
Différence entre i ++ et ++ i
[Java débutant] Différence entre la longueur et la longueur () ~ Je ne sais pas ~
La différence entre la programmation qui utilise des classes Ruby et la programmation qui n'utilise pas
L'évaluation des courts-circuits est-elle vraiment rapide? Différence entre && et & en Java
Différence entre produit et variante
Différence entre redirect_to et render
[Java] Différence entre == et égal
Différence entre redirect_to et render
Différence entre CUI et GUI
Différence entre les variables et les variables d'instance
Différence entre mockito-core et mockito-all
Différence entre l'installation de bundle et de bundle
Relation entre le package et la classe
Différence entre ArrayList et LinkedList
Différence entre render et redirect_to
Différence entre List et ArrayList
[Ruby] Différence entre match / scan
Différence entre .bashrc et .bash_profile
Différence entre StringBuilder et StringBuffer
Différence entre render et redirect_to
[Ruby] Relation entre la classe parent et la classe enfant. Relation entre classe et instance.
Différence entre l'opérateur == et la méthode égale
[Java] Différence entre Hashmap et HashTable
[Terminal] Différence entre irb et pry
Différence entre l'opérateur == et la méthode eqals
Différence approximative entre RSpec et minitest
[Rails] Différence entre find et find_by
[JAVA] Différence entre abstrait et interface