English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ruby est un langage orienté objet pur, tout dans Ruby apparaît sous la forme d'un objet. Chaque valeur en Ruby est un objet, même les choses les plus primitives : les chaînes, les nombres, même true et false sont des objets. La classe elle-même est aussi unun objetest Class Exemple de classe
La classe est utilisée pour spécifier la forme de l'objet, elle combine la représentation des données et les méthodes, regroupant les données en un paquet bien rangé. Les données et les méthodes dans la classe sont appelées membres de la classe.
Lorsque vous définissez une classe, vous définissez en réalité un plan de type de données. Cela ne définit pas de données, mais définit ce que signifie le nom de la classe, c'est-à-dire ce que composent les objets de la classe et quelles opérations peuvent être exécutées sur ces objets.
La définition de la classe se termine par le mot-clé class La définition de la classe commence parnom de la classe,et enfin, commence par un end pour séparer et terminer la définition de la classe. Par exemple, nous utilisons le mot-clé class pour définir la classe Box, comme suit :
class Box code end
Selon la convention, le nom doit commencer par une majuscule, et si il contient plusieurs mots, chaque mot doit commencer par une majuscule, mais sans séparateurs (par exemple : CamelCase).
La classe fournit un plan pour les objets, donc en général, les objets sont créés selon la classe. Nous utilisons new La syntaxe des mots-clés déclare un objet de la classe. Les lignes suivantes déclarent deux objets de la classe Box :
box1 = Box.new box2 = Box.new
initialize La méthode est une méthode de classe standard en Ruby, c'est le constructeur de la classe, et il est similaire à celui des autres langages de programmation orientés objet constructeur Le principe de fonctionnement est similaire. Lorsque vous souhaitez initialiser des variables de classe en même temps que la création d'un objet, la méthode initialize entre en jeu. Cette méthode prend une série de paramètres, comme d'autres méthodes Ruby, et doit être précédée de def La syntaxe des mots-clés, comme suit :
class Box def initialize(w,h) @width, @height = w, h end end
Exemple de variableLes attributs de classe, qui deviennent les attributs de l'objet lors de la création d'un objet à partir de la classe. Chaque attribut de l'objet est assigné individuellement, et les valeurs ne sont pas partagées entre les autres objets. À l'intérieur de la classe, les attributs sont accédés à l'aide de l'opérateur @, et à l'extérieur de la classe, c'est en utilisant ce qui est appeléaccessor methodsofPublicmethod to access. Below we use the class Box For example, use @width and @height as instance variables of the class Box.
class Box def initialize(w,h) # Assigning a value to the example variable @width, @height = w, h end end
To read variables defined within the class from outside the class, we can define accessor (getter) methods to access. The following example demonstrates the usage of accessor methods:
#!/usr/bin/ruby -w # Define class class Box # Constructor def initialize(w,h) @width, @height = w, h end # Méthodes d'accès def printWidth @width end def printHeight @height end end # Creating an object, initializing the height and width of the box box = Box.new(10, 20) # Méthodes d'accès x = box.printWidth() y = box.printHeight() puts "Box width: #{x}" puts "Box height: #{y}"
当上面的代码执行时,它会产生以下结果:
Box width : 10 Box height : 20
Similar to the accessor method used to access variable values, Ruby provides a way to pass parameters to class-defined variables from outside the class, which is known asSetter method, defined as follows:
#!/usr/bin/ruby -w # Define class class Box # Constructor method def initialize(w,h) @width, @height = w, h end # Méthodes d'accès def getWidth @width end def getHeight @height end # Méthodes de setter def setWidth=(value) @width = value end def setHeight=(value) @height = value end end # Create object box = Box.new(10, 20) # Using setter method box.setWidth = 30 box.setHeight = 50 # Méthodes d'accès x = box.getWidth() y = box.getHeight() puts "Box width: #{x}" puts "Box height: #{y}"
当上面的代码执行时,它会产生以下结果:
Box width : 30 Box height : 50
Since both methods are very commonly used, Ruby defines attr_accessor :variable_name, attr_reader :variable_name, attr_writer :variable_name Three methods of property declaration. Among which:accessor = reader+writer.
At the same time, note that the variable name must be prefixed with :, and variable names must be separated by ,
instance methodsThe definition is the same as other method definitions, using def Keywords, but they can only be used through class instances, as shown in the following example. Their functions are not limited to accessing instance variables, but can also perform other tasks as needed.
#!/usr/bin/ruby -w # Define class class Box # Constructor def initialize(w,h) @width, @height = w, h end # Example method def getArea @width * @height end end # Create object box = Box.new(10, 20) # Call example method a = box.getArea() puts "Area of the box is: #{a}"
当上面的代码执行时,它会产生以下结果:
Area of the box is : 200
Class variableare shared variables across all instances of the class. In other words, the class variable instance can be accessed by all object instances. Class variables are prefixed with two @ characters (@@), and class variables must be initialized within the class definition, as shown in the following example.
class methodsUsing def self.methodname() Definition, class methods end with the delimiter end. Class methods can use names with the class name as prefix classname.methodname Formal call, as shown in the following example:
#!/usr/bin/ruby -w class Box # Initializing class variable @@count = 0 def initialize(w,h) # Assigning a value to the example variable @width, @height = w, h @@count += 1 end def self.printCount() puts "Box count is: #@@count" end end # Créer deux objets box1 = Box.new(10, 20) box2 = Box.new(30, 100) # Appel de la méthode de classe pour afficher le comptage des boîtes Box.printCount()
当上面的代码执行时,它会产生以下结果:
Le comptage de Box est : 2
Toute classe que vous définissez a une to_s Les méthodes d'exemple permettent de retourner la représentation en chaîne de caractères de l'objet. Voici un exemple simple, selon la largeur et la hauteur pour représenter l'objet Box :
#!/usr/bin/ruby -w class Box # Constructor method def initialize(w,h) @width, @height = w, h end # Définir la méthode to_s def to_s "(w:#@width,h:#@height)" # Format de chaîne de l'objet end end # Create object box = Box.new(10, 20) # Appel automatique de la méthode to_s puts "Représentation en chaîne de caractères de la boîte : : #{box}"
当上面的代码执行时,它会产生以下结果:
Représentation en chaîne de caractères de la boîte : (w:10,h:20)
Ruby vous offre trois niveaux de protection des méthodes d'exemple,分别是 public, privé ou protégé.Ruby n'applique aucune contrôle d'accès aux exemples et aux variables de classe.
Méthode publique : Les méthodes publiques peuvent être appelées par n'importe quel objet. Par défaut, les méthodes sont publiques, à l'exception de la méthode initialize qui est toujours privée.
Méthode privée : Les méthodes privées ne peuvent pas être appelées ou consultées à partir de l'extérieur de la classe. Seules les méthodes de la classe peuvent accéder aux membres privés.
Méthode protégée : Les méthodes protégées peuvent être appelées par les objets de la classe et ses sous-classes. L'accès peut également être effectué à l'intérieur de la classe et de ses sous-classes.
Voici un exemple simple qui montre la syntaxe des trois modificateurs :
#!/usr/bin/ruby -w # Define class class Box # Constructor method def initialize(w,h) @width, @height = w, h end # Les méthodes d'exemple sont par défaut publiques def getArea getWidth() * getHeight end # Définir des méthodes d'accès privées def getWidth @width end def getHeight @height end # Les rendre privées privé :getWidth, :getHeight # Méthode d'exemple pour afficher la surface def printArea @aire = getWidth() * getHeight puts "La surface de la grande boîte est : \@area" end # Rendre la méthode d'exemple protégée protégée :printArea end # Create object box = Box.new(10, 20) # Call example method a = box.getArea() puts "Area of the box is: #{a}" # Tentative d'appel d'une méthode protégée box.printArea()
Lorsque ce code est exécuté, il produit les résultats suivants. Ici, la première méthode est appelée avec succès, mais la deuxième méthode pose un problème.
Area of the box is : 200 test.rb:42: méthode protégée `printArea' appelée pour # <Boîte:0xb7f11280 @hauteur=20, @largeur=10> Erreur de méthode non trouvée
héritage, qui est l'une des principales concepts de programmation orientée objet. L'héritage nous permet de définir une classe en fonction d'une autre classe, ce qui rend la création et la maintenance des applications plus faciles.
L'héritage aide à réutiliser le code et à exécuter rapidement, malheureusement, Ruby ne supporte pas l'héritage multiple, mais Ruby supporte mixins.Mixin est une implémentation spécifique de l'héritage multiple, où seules les parties interface sont héritées.
Lors de la création d'une classe, le programmeur peut directement spécifier que la nouvelle classe hérite des membres d'une classe existante, sans avoir à réécrire de nouveaux membres de données et fonctions membres. Cette classe existante est appeléeclasse de base ou classe parente, la nouvelle classe est appeléeclasse dérivée ou sous-classe.
Ruby offre également le concept de spécialisation, qui est l'héritage. Les exemples suivants expliquent ce concept. L'extension d'une classe est très simple. Il suffit d'ajouter un < suivi du nom de la classe parente à la déclaration de la classe. Par exemple, la classe suivante est définie : BigBox est Box de la sous-classe :
#!/usr/bin/ruby -w # Define class class Box # Constructor method def initialize(w,h) @width, @height = w, h end # Example method def getArea @width * @height end end # Définir une sous-classe class BigBox < Box # Ajouter une nouvelle méthode d'exemple def printArea @area = @width * @height puts "La surface de la grande boîte est : \@area" end end # Create object box = BigBox.new(10, 20) # Afficher l'aire box.printArea()
当上面的代码执行时,它会产生以下结果:
La surface de la grande boîte est : 200
Bien que vous puissiez ajouter de nouvelles fonctionnalités dans la classe dérivée, parfois vous pouvez vouloir changer le comportement d'une méthode déjà définie dans la classe parente. Dans ce cas, vous pouvez conserver le nom de la méthode, mais redéfinir sa fonctionnalité, comme dans l'exemple suivant :
#!/usr/bin/ruby -w # Define class class Box # Constructor method def initialize(w,h) @width, @height = w, h end # Example method def getArea @width * @height end end # Définir une sous-classe class BigBox < Box # Changer la méthode existante getArea def getArea @area = @width * @height puts "La surface de la grande boîte est : \@area" end end # Create object box = BigBox.new(10, 20) # Afficher l'aire en utilisant la méthode surchargée box.getArea()
Les résultats d'exécution des exemples ci-dessus sont :
La surface de la grande boîte est : 200
nous voulons utiliser + opérateur pour effectuer l'addition vectorielle entre deux objets Box, en utilisant * opérateur pour multiplier la largeur et la hauteur de Box, en utilisant un opérateur unaire - Calculer l'inverse de width et height de Box. Voici une version de la classe Box avec des opérateurs mathématiques définis :
class Box def initialize(w,h) # Initialiser width et height @width, @height = w, h end def +(other) # Définir + pour exécuter l'addition vectorielle Box.new(@width + other.width, @height + other.height) end def -@ # Définir un opérateur unaire - inverser les valeurs de width et height Box.new(-@width, -@height) end def *(scalar) # Effectuer la multiplication scalaire Box.new(@width*scalar, @height*scalar) end end
Parfois, nous voulons empêcher un objet d'être modifié. Dans Object, la méthode freeze permet cela, elle transforme efficacement un objet en une constante. Tout objet peut être figé en appelant Object.freeze pour figer. Un objet figé ne peut pas être modifié, c'est-à-dire que vous ne pouvez pas changer ses variables d'exemple.
Vous pouvez utiliser Object.frozen? La méthode vérifie si un objet donné a été figé. Si l'objet a été figé, cette méthode retourne true, sinon elle retourne une valeur false. L'exemple suivant explique ce concept :
#!/usr/bin/ruby -w # Define class class Box # Constructor method def initialize(w,h) @width, @height = w, h end # Méthodes d'accès def getWidth @width end def getHeight @height end # Méthodes de setter def setWidth=(value) @width = value end def setHeight=(value) @height = value end end # Create object box = Box.new(10, 20) # Laissons figer cet objet box.freeze if( box.frozen? ) puts "L'objet Box est un objet figé" else puts "L'objet Box est un objet normal" end # Essayons maintenant d'utiliser les méthodes de setter box.setWidth = 30 box.setHeight = 50 # Méthodes d'accès x = box.getWidth() y = box.getHeight() puts "Width of the box is : #{x}" puts "Height of the box is : #{y}"
当上面的代码执行时,它会产生以下结果:
L'objet Box est un objet figé test.rb:20:in `setWidth=': can't modify frozen object (TypeError) from test.rb:39
Vous pouvez définir un constant à l'intérieur de la classe, en assignant une valeur numérique ou une valeur de chaîne directe à une variable. La définition d'un constant n'a pas besoin d'utiliser @ ou @@. D'habitude, le nom des constants est en majuscules.
Une fois qu'un constant est défini, vous ne pouvez pas changer sa valeur, vous pouvez accéder directement au constant à l'intérieur de la classe, comme si c'était une variable, mais si vous souhaitez accéder au constant à l'extérieur de la classe, vous devez utiliser classname::constant,如下面示例所示。
#!/usr/bin/ruby -w # Define class class Box BOX_COMPANY = "TATA Inc" BOXWEIGHT = 10 # Constructor method def initialize(w,h) @width, @height = w, h end # Example method def getArea @width * @height end end # Create object box = Box.new(10, 20) # Call example method a = box.getArea() puts "Area of the box is: #{a}" puts Box::BOX_COMPANY puts "Box weight is: #{Box::BOXWEIGHT}"
当上面的代码执行时,它会产生以下结果:
Area of the box is : 200 TATA Inc Box weight is: 10
Class constants can be inherited and can also be overloaded like example methods.
There may be a situation where you want to create an object without calling the object constructor initialize In the case of creating an object, that is, using the new method to create an object, in this case, you can call allocate to create an uninitialized object, as shown in the following example:
#!/usr/bin/ruby -w # Define class class Box attr_accessor :width, :height # Constructor method def initialize(w,h) @width, @height = w, h end # Example method def getArea @width * @height end end # Use new to create an object box1 = Box.new(10, 20) # Use allocate to create another object box2 = Box.allocate # Use box1 Call example method a = box1.getArea() puts "Area of the box is: #{a}" # Use box2 Call example method a = box2.getArea() puts "Area of the box is: #{a}"
当上面的代码执行时,它会产生以下结果:
Area of the box is : 200 test.rb:14: warning: instance variable @width not initialized test.rb:14: warning: instance variable @height not initialized test.rb:14:in `getArea': undefined method `*" for nil:NilClass (NoMethodError) from test.rb:29
Ruby's self and Java's this have similarities, but they are also very different. Java methods always refer to the current object, so this is usually the current object. However, Ruby code is executed line by line, so self has different meanings in different contexts. Let's take a look at the following example:.
#!/usr/bin/ruby -w class Box # 输出类信息 puts "Classe de self = #{self.class}" puts "Nom de self = #{self.name}" end
当上面的代码执行时,它会产生以下结果:
Classe de self = Class Nom de self = Box
这意味着类定义可以通过将此类作为当前对象来执行,同时也意味着元类和父类中的该方法在方法定义执行期间是可用的。