add toolbox
This commit is contained in:
1 parent
1bf550a752
commit
58c443ec6c
1 file changed
+687
+687
@@ -0,0 +1,687 @@
|
|||||||
|
# Toolbox Ruby
|
||||||
|
|
||||||
|
Cette fiche regroupe les méthodes Ruby les plus courantes à connaître ou à savoir retrouver rapidement.
|
||||||
|
|
||||||
|
Certaines méthodes utilisées avec `Array`, `Hash` ou `Range` proviennent en réalité du module `Enumerable`.
|
||||||
|
|
||||||
|
## String
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
text = "Bonjour Ruby"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Informations
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `length` / `size` | Nombre de caractères | `text.length` |
|
||||||
|
| `empty?` | Vérifie si la chaîne est vide | `text.empty?` |
|
||||||
|
| `include?` | Cherche une sous-chaîne | `text.include?("Ruby")` |
|
||||||
|
| `start_with?` | Vérifie le début | `text.start_with?("Bon")` |
|
||||||
|
| `end_with?` | Vérifie la fin | `text.end_with?("Ruby")` |
|
||||||
|
| `match?` | Teste une expression régulière | `text.match?(/Ruby/)` |
|
||||||
|
|
||||||
|
### Transformer
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `upcase` | Met en majuscules | `text.upcase` |
|
||||||
|
| `downcase` | Met en minuscules | `text.downcase` |
|
||||||
|
| `capitalize` | Met la première lettre en majuscule | `text.capitalize` |
|
||||||
|
| `strip` | Supprime les espaces aux extrémités | `" Ruby ".strip` |
|
||||||
|
| `reverse` | Inverse la chaîne | `"Ruby".reverse` |
|
||||||
|
| `sub` | Remplace la première occurrence | `"test test".sub("test", "Ruby")` |
|
||||||
|
| `gsub` | Remplace toutes les occurrences | `"a-a-a".gsub("-", "_")` |
|
||||||
|
|
||||||
|
### Découper
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `split` | Découpe en tableau | `"a,b,c".split(",")` |
|
||||||
|
| `chars` | Retourne un tableau de caractères | `"Ruby".chars` |
|
||||||
|
| `lines` | Retourne un tableau de lignes | `"a\nb".lines` |
|
||||||
|
|
||||||
|
### Convertir
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `to_i` | Convertit en entier | `"42".to_i` |
|
||||||
|
| `to_f` | Convertit en nombre décimal | `"3.14".to_f` |
|
||||||
|
| `to_sym` | Convertit en symbole | `"name".to_sym` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Integer
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
number = 42
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tester
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `even?` | Nombre pair | `42.even?` |
|
||||||
|
| `odd?` | Nombre impair | `7.odd?` |
|
||||||
|
| `zero?` | Égal à zéro | `0.zero?` |
|
||||||
|
| `positive?` | Strictement positif | `5.positive?` |
|
||||||
|
| `negative?` | Strictement négatif | `(-5).negative?` |
|
||||||
|
|
||||||
|
### Manipuler
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `abs` | Valeur absolue | `(-5).abs` |
|
||||||
|
| `digits` | Retourne les chiffres en ordre inverse | `123.digits # => [3, 2, 1]` |
|
||||||
|
|
||||||
|
### Répéter
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
3.times do
|
||||||
|
puts "Ruby"
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
`times` est particulièrement utile pour effectuer une action un nombre précis de fois.
|
||||||
|
|
||||||
|
### Convertir
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `to_s` | Convertit en chaîne | `42.to_s` |
|
||||||
|
| `to_f` | Convertit en nombre décimal | `42.to_f` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Float
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
number = 3.14159
|
||||||
|
```
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `round` | Arrondit | `3.14159.round(2) # => 3.14` |
|
||||||
|
| `floor` | Arrondit vers le bas | `3.9.floor # => 3` |
|
||||||
|
| `ceil` | Arrondit vers le haut | `3.1.ceil # => 4` |
|
||||||
|
| `to_i` | Convertit en entier | `3.9.to_i # => 3` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Array
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers = [1, 2, 3]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Informations
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `length` / `size` | Nombre d'éléments | `numbers.length` |
|
||||||
|
| `empty?` | Vérifie si le tableau est vide | `numbers.empty?` |
|
||||||
|
| `include?` | Vérifie la présence d'une valeur | `numbers.include?(2)` |
|
||||||
|
| `index` | Position d'un élément | `numbers.index(2)` |
|
||||||
|
|
||||||
|
### Accéder aux éléments
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `[]` | Accède à un élément | `numbers[0]` |
|
||||||
|
| `first` | Premier élément | `numbers.first` |
|
||||||
|
| `last` | Dernier élément | `numbers.last` |
|
||||||
|
|
||||||
|
Les indices commencent à `0`.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers[0]
|
||||||
|
# => 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Les intervalles permettent d'extraire plusieurs éléments :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers[1..]
|
||||||
|
# => [2, 3]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ajouter et retirer
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `<<` | Ajoute à la fin | `numbers << 4` |
|
||||||
|
| `push` | Ajoute à la fin | `numbers.push(4)` |
|
||||||
|
| `pop` | Retire et retourne le dernier | `numbers.pop` |
|
||||||
|
| `unshift` | Ajoute au début | `numbers.unshift(0)` |
|
||||||
|
| `shift` | Retire et retourne le premier | `numbers.shift` |
|
||||||
|
| `delete` | Supprime les éléments égaux à une valeur | `numbers.delete(2)` |
|
||||||
|
|
||||||
|
### Transformer
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `reverse` | Inverse le tableau | `numbers.reverse` |
|
||||||
|
| `sort` | Trie | `[3, 1, 2].sort` |
|
||||||
|
| `uniq` | Supprime les doublons | `[1, 1, 2].uniq` |
|
||||||
|
| `compact` | Supprime les `nil` | `[1, nil, 2].compact` |
|
||||||
|
| `flatten` | Aplatit les tableaux imbriqués | `[[1, 2], [3]].flatten` |
|
||||||
|
| `join` | Transforme en chaîne | `[1, 2, 3].join("-")` |
|
||||||
|
| `shuffle` | Mélange | `numbers.shuffle` |
|
||||||
|
| `sample` | Prend un élément au hasard | `numbers.sample` |
|
||||||
|
|
||||||
|
### Combinaisons
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
[1, 2, 3].combination(2).to_a
|
||||||
|
# => [[1, 2], [1, 3], [2, 3]]
|
||||||
|
```
|
||||||
|
|
||||||
|
`combination` est utile lorsque l'ordre des éléments n'a pas d'importance.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Hash
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
person = {
|
||||||
|
name: "Alice",
|
||||||
|
age: 30
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Accéder aux valeurs
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
person[:name]
|
||||||
|
# => "Alice"
|
||||||
|
```
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `[]` | Lit une valeur | `person[:name]` |
|
||||||
|
| `[]=` | Ajoute ou modifie une valeur | `person[:age] = 31` |
|
||||||
|
| `fetch` | Lit une clé et signale son absence | `person.fetch(:name)` |
|
||||||
|
| `dig` | Cherche dans des structures imbriquées | `data.dig(:user, :name)` |
|
||||||
|
|
||||||
|
### Informations
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `keys` | Retourne les clés | `person.keys` |
|
||||||
|
| `values` | Retourne les valeurs | `person.values` |
|
||||||
|
| `key?` | Vérifie la présence d'une clé | `person.key?(:name)` |
|
||||||
|
| `value?` | Vérifie la présence d'une valeur | `person.value?("Alice")` |
|
||||||
|
| `empty?` | Vérifie si le Hash est vide | `person.empty?` |
|
||||||
|
| `size` | Nombre de paires clé-valeur | `person.size` |
|
||||||
|
|
||||||
|
### Modifier
|
||||||
|
|
||||||
|
| Méthode | Utilité | Exemple |
|
||||||
|
|---|---|---|
|
||||||
|
| `delete` | Supprime une clé | `person.delete(:age)` |
|
||||||
|
| `merge` | Retourne un nouveau Hash fusionné | `person.merge(city: "Paris")` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Enumerable
|
||||||
|
|
||||||
|
`Enumerable` fournit une grande partie des méthodes utilisées pour parcourir, transformer et interroger des collections.
|
||||||
|
|
||||||
|
`Array`, `Hash` et `Range` utilisent notamment ce module.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers = [1, 2, 3, 4]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parcourir
|
||||||
|
|
||||||
|
#### `each`
|
||||||
|
|
||||||
|
Effectue une action pour chaque élément.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.each do |number|
|
||||||
|
puts number
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `each_with_index`
|
||||||
|
|
||||||
|
Fournit l'élément et sa position.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.each_with_index do |number, index|
|
||||||
|
puts "#{index}: #{number}"
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
### Transformer : `map`
|
||||||
|
|
||||||
|
Crée un nouveau tableau en transformant chaque élément.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.map { |number| number * 2 }
|
||||||
|
# => [2, 4, 6, 8]
|
||||||
|
```
|
||||||
|
|
||||||
|
À retenir :
|
||||||
|
|
||||||
|
> `map` = transformer chaque élément.
|
||||||
|
|
||||||
|
### Filtrer : `select`
|
||||||
|
|
||||||
|
Conserve les éléments qui respectent une condition.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.select(&:even?)
|
||||||
|
# => [2, 4]
|
||||||
|
```
|
||||||
|
|
||||||
|
À retenir :
|
||||||
|
|
||||||
|
> `select` = garder certains éléments.
|
||||||
|
|
||||||
|
### Rejeter : `reject`
|
||||||
|
|
||||||
|
Inverse de `select`.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.reject(&:even?)
|
||||||
|
# => [1, 3]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Trouver : `find`
|
||||||
|
|
||||||
|
Retourne le premier élément correspondant.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.find { |number| number > 2 }
|
||||||
|
# => 3
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tester une collection
|
||||||
|
|
||||||
|
#### `any?`
|
||||||
|
|
||||||
|
Au moins un élément correspond-il ?
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.any?(&:even?)
|
||||||
|
# => true
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `all?`
|
||||||
|
|
||||||
|
Tous les éléments correspondent-ils ?
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.all?(&:positive?)
|
||||||
|
# => true
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `none?`
|
||||||
|
|
||||||
|
Aucun élément ne correspond-il ?
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.none?(&:negative?)
|
||||||
|
# => true
|
||||||
|
```
|
||||||
|
|
||||||
|
### Compter : `count`
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.count(&:even?)
|
||||||
|
# => 2
|
||||||
|
```
|
||||||
|
|
||||||
|
### Additionner : `sum`
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.sum
|
||||||
|
# => 10
|
||||||
|
```
|
||||||
|
|
||||||
|
### Minimum et maximum
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.min
|
||||||
|
numbers.max
|
||||||
|
```
|
||||||
|
|
||||||
|
Pour choisir selon une propriété :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
words = ["chat", "éléphant", "chien"]
|
||||||
|
|
||||||
|
words.min_by(&:length)
|
||||||
|
# => "chat"
|
||||||
|
|
||||||
|
words.max_by(&:length)
|
||||||
|
# => "éléphant"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Trier selon un critère : `sort_by`
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
words.sort_by(&:length)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Regrouper : `group_by`
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
words.group_by(&:length)
|
||||||
|
```
|
||||||
|
|
||||||
|
Retourne un `Hash` regroupant les éléments selon le résultat du bloc.
|
||||||
|
|
||||||
|
### Parcourir par groupes
|
||||||
|
|
||||||
|
#### `each_cons`
|
||||||
|
|
||||||
|
Groupes successifs qui se chevauchent :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
[1, 2, 3, 4].each_cons(2).to_a
|
||||||
|
# => [[1, 2], [2, 3], [3, 4]]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `each_slice`
|
||||||
|
|
||||||
|
Groupes successifs qui ne se chevauchent pas :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
[1, 2, 3, 4].each_slice(2).to_a
|
||||||
|
# => [[1, 2], [3, 4]]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Accumuler : `reduce` / `inject`
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
[1, 2, 3, 4].reduce(0) do |total, number|
|
||||||
|
total + number
|
||||||
|
end
|
||||||
|
|
||||||
|
# => 10
|
||||||
|
```
|
||||||
|
|
||||||
|
Pour une simple addition, `sum` est généralement plus clair.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Range
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
range = 1..5
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parcourir
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
(1..5).each do |number|
|
||||||
|
puts number
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tester
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
(1..5).include?(3)
|
||||||
|
# => true
|
||||||
|
```
|
||||||
|
|
||||||
|
### Convertir en tableau
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
(1..5).to_a
|
||||||
|
# => [1, 2, 3, 4, 5]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Avancer par étapes
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
(0..10).step(2).to_a
|
||||||
|
# => [0, 2, 4, 6, 8, 10]
|
||||||
|
```
|
||||||
|
|
||||||
|
### `..` et `...`
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
1..5
|
||||||
|
```
|
||||||
|
|
||||||
|
inclut `5`.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
1...5
|
||||||
|
```
|
||||||
|
|
||||||
|
n'inclut pas `5`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Regexp
|
||||||
|
|
||||||
|
Les expressions régulières permettent de rechercher un motif dans du texte.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
text = "Ruby123"
|
||||||
|
```
|
||||||
|
|
||||||
|
### `match?`
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
text.match?(/\d+/)
|
||||||
|
# => true
|
||||||
|
```
|
||||||
|
|
||||||
|
Quelques motifs courants :
|
||||||
|
|
||||||
|
| Motif | Signification |
|
||||||
|
|---|---|
|
||||||
|
| `\d` | chiffre |
|
||||||
|
| `\w` | caractère de mot |
|
||||||
|
| `\s` | espace |
|
||||||
|
| `.` | presque n'importe quel caractère |
|
||||||
|
| `+` | une ou plusieurs fois |
|
||||||
|
| `*` | zéro ou plusieurs fois |
|
||||||
|
| `?` | zéro ou une fois |
|
||||||
|
| `\A` | début de chaîne |
|
||||||
|
| `\z` | fin de chaîne |
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
"123".match?(/\A\d+\z/)
|
||||||
|
# => true
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Object
|
||||||
|
|
||||||
|
Ces méthodes sont utiles avec presque tous les objets Ruby.
|
||||||
|
|
||||||
|
### `class`
|
||||||
|
|
||||||
|
Retourne la classe de l'objet.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
"Ruby".class
|
||||||
|
# => String
|
||||||
|
|
||||||
|
42.class
|
||||||
|
# => Integer
|
||||||
|
```
|
||||||
|
|
||||||
|
Très utile pour comprendre ce que l'on manipule.
|
||||||
|
|
||||||
|
### `nil?`
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
value.nil?
|
||||||
|
```
|
||||||
|
|
||||||
|
Teste si une valeur est `nil`.
|
||||||
|
|
||||||
|
### `is_a?`
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
"Ruby".is_a?(String)
|
||||||
|
# => true
|
||||||
|
```
|
||||||
|
|
||||||
|
### `respond_to?`
|
||||||
|
|
||||||
|
Vérifie qu'un objet répond à une méthode.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
"Ruby".respond_to?(:upcase)
|
||||||
|
# => true
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Conversions courantes
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
42.to_s
|
||||||
|
"42".to_i
|
||||||
|
"3.14".to_f
|
||||||
|
|
||||||
|
"Ruby".chars
|
||||||
|
"Ruby".to_sym
|
||||||
|
|
||||||
|
(1..5).to_a
|
||||||
|
|
||||||
|
["a", "b", "c"].join(", ")
|
||||||
|
```
|
||||||
|
|
||||||
|
Lorsque quelque chose semble impossible à manipuler directement, penser à la question :
|
||||||
|
|
||||||
|
> **Est-ce que je dois d'abord convertir cet objet ?**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Choisir une méthode selon le besoin
|
||||||
|
|
||||||
|
| Je veux… | Penser à… |
|
||||||
|
|---|---|
|
||||||
|
| parcourir tous les éléments | `each` |
|
||||||
|
| connaître également leur position | `each_with_index` |
|
||||||
|
| transformer chaque élément | `map` |
|
||||||
|
| garder certains éléments | `select` |
|
||||||
|
| éliminer certains éléments | `reject` |
|
||||||
|
| trouver le premier élément correspondant | `find` |
|
||||||
|
| savoir si au moins un correspond | `any?` |
|
||||||
|
| savoir si tous correspondent | `all?` |
|
||||||
|
| savoir si aucun ne correspond | `none?` |
|
||||||
|
| compter les éléments correspondants | `count` |
|
||||||
|
| additionner | `sum` |
|
||||||
|
| trouver le plus petit / grand | `min`, `max` |
|
||||||
|
| comparer selon une propriété | `min_by`, `max_by` |
|
||||||
|
| trier selon une propriété | `sort_by` |
|
||||||
|
| regrouper selon une propriété | `group_by` |
|
||||||
|
| parcourir avec les voisins | `each_cons` |
|
||||||
|
| parcourir par groupes séparés | `each_slice` |
|
||||||
|
| combiner des éléments | `combination` |
|
||||||
|
| répéter N fois | `times` |
|
||||||
|
| découper une chaîne | `split`, `chars` |
|
||||||
|
| chercher dans une chaîne | `include?`, `match?` |
|
||||||
|
| ajouter à un tableau | `<<`, `push` |
|
||||||
|
| retirer le dernier élément | `pop` |
|
||||||
|
| retirer le premier élément | `shift` |
|
||||||
|
| obtenir le type d'un objet | `class` |
|
||||||
|
| vérifier une méthode disponible | `respond_to?` |
|
||||||
|
| convertir un objet | `to_s`, `to_i`, `to_f`, `to_a` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Méthodes avec `!`
|
||||||
|
|
||||||
|
Certaines méthodes possèdent une version terminée par `!` :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.sort
|
||||||
|
numbers.sort!
|
||||||
|
```
|
||||||
|
|
||||||
|
Dans ce type de paire, la méthode sans `!` retourne généralement un nouvel objet alors que la version avec `!` modifie directement le receveur.
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers = [3, 1, 2]
|
||||||
|
|
||||||
|
sorted = numbers.sort
|
||||||
|
|
||||||
|
numbers
|
||||||
|
# => [3, 1, 2]
|
||||||
|
|
||||||
|
sorted
|
||||||
|
# => [1, 2, 3]
|
||||||
|
```
|
||||||
|
|
||||||
|
Avec :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
numbers.sort!
|
||||||
|
```
|
||||||
|
|
||||||
|
`numbers` lui-même est modifié.
|
||||||
|
|
||||||
|
Le `!` est une convention Ruby signalant une méthode plus dangereuse ou ayant des effets plus importants que sa version correspondante sans `!`.
|
||||||
|
|
||||||
|
Il ne signifie pas systématiquement « modifie l'objet » et toutes les méthodes qui modifient un objet ne se terminent pas par `!`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Réflexe devant un exercice
|
||||||
|
|
||||||
|
Avant de chercher une méthode, identifier ce que l'on manipule :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
object.class
|
||||||
|
```
|
||||||
|
|
||||||
|
Puis formuler l'opération recherchée :
|
||||||
|
|
||||||
|
```text
|
||||||
|
Quel est mon objet ?
|
||||||
|
↓
|
||||||
|
String / Integer / Array / Hash…
|
||||||
|
↓
|
||||||
|
Qu'est-ce que je veux obtenir ?
|
||||||
|
↓
|
||||||
|
parcourir / transformer / filtrer / chercher / convertir…
|
||||||
|
↓
|
||||||
|
Quelle famille de méthodes correspond ?
|
||||||
|
```
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
number = 123
|
||||||
|
```
|
||||||
|
|
||||||
|
Je veux parcourir ses chiffres.
|
||||||
|
|
||||||
|
```text
|
||||||
|
Integer
|
||||||
|
↓
|
||||||
|
je veux une collection de chiffres
|
||||||
|
↓
|
||||||
|
conversion possible
|
||||||
|
↓
|
||||||
|
to_s
|
||||||
|
↓
|
||||||
|
String
|
||||||
|
↓
|
||||||
|
chars
|
||||||
|
↓
|
||||||
|
Array
|
||||||
|
↓
|
||||||
|
each / map / each_with_index…
|
||||||
|
```
|
||||||
|
|
||||||
|
La bonne méthode n'est pas nécessairement disponible sur l'objet de départ : **la conversion vers un type plus adapté fait souvent partie de la solution**.
|
||||||
Reference in new issue
Block a user