- Pourquoi dans ta constante
FILE_PATH
n'est pas une constante de classe ? Je pensais que toutes les variables à l'intérieur d'une classe devaient être préfixées de @
!
Pas toutes. Une classe peut contenir trois types de variable :
@variable
avec un seul @
est une "variables d'instance". C'est le type le plus commun. Sa valeur diffère d'une instance à l'autre :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | class Car
def initialize
@passengers = 0
end
def passengers; @passengers; end
def passengers=(how_many); @passengers = how_many; end
end
a = Car.new
b = Car.new
puts a.passengers # => 0
puts b.passengers # => 0
a.passengers = 3
puts a.passengers # => 3
puts b.passengers # => 0
|
@@variable
est une "variable de classe". Ce n'est pas une constante et elle est partagée avec chaque instance :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | class Car
@@passengers = 0
def passengers; @@passengers; end
def passengers=(how_many); @@passengers = how_many; end
end
a = Car.new
b = Car.new
puts a.passengers # => 0
puts b.passengers # => 0
a.passengers = 3
puts a.passengers # => 3
puts b.passengers # => 3 aussi !
|
Tandis que les constantes (variables commencant par une majuscule et sans préfixe) sont figés :
| class Bacon
QUALITY = :perfect
QUALITY = :terrible
end
# warning: already initialized constant Bacon::QUALITY
puts Bacon::QUALITY # affiche "terrible"
|
…ou pas. Comme ruby n'est pas bien strict à ce sujet (d'ailleurs, les avertissement peuvent être désactivés…),
les variables constantes sont plus une indication par l'auteur du code aux autres programmeurs pour indiquer que la valeur ne devrait pas changer, plutôt que autre chose.
Note qu'il y a aucune différence entre une variable "constante" à l'intérieur d'une classe et une autre à l'exérieur.
- C'est quoi ces symbol en Ruby ? Ça me dépasse totalement…
Ce sont des chaînes de caractères légères. Ça signifie qu'elles sont créées une seule fois en mémoire et ne peuvent pas être manipulés autant qu'un objet de type String
:
| puts 'hello_world'.object_id == 'hello_world'.object_id # => false, ce n'est pas le même objet
puts :hello_world.object_id == :hello_world.object_id # => true
puts 'hello world'.sub 'world', 'cfillion' # => hello cfillion
puts :'hello world'.sub 'world', 'cfillion' # => NoMethodError: undefined method `sub' for :"hello world":Symbol
|
En pratique les symboles sont utilisés quand les fonctionalités avancés de String
ne sont pas requises. Par exemple tu pourrais les utiliser pour spécifier le type des transactions :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | class Transaction
def initialize(type, amount, description)
case type
when :+
puts 'dépôt'
when :-
puts 'retrait'
end
# ...
end
end
Transaction.new :-, 10, 'assez pour commander un sandwich au bacon' # affiche "retrait"
Transaction.new :+, 2.5, "finalement le sandwich a couté que 7.5" # affiche "dépôt"
|
Le même code avec des chaîne des caractères normales aurait créé deux fois plus d'objets en mémoire (c'est vraiment pas beaucoup mais à la longue, ça compte !).
- Pourquoi une constante est… modifiable !?
Parce que ruby n'impose pas (ou peu ?) de limites artificielles au programmeur. Si il veut modifier sa constante, c'est son problème !
Bon le seul problème c'est que j'en ai jamais manipulé et encore moins en Ruby. Donc SQLite me parait bien compliqué… Si vous avez un article qui explique ça bien, je suis preneur ! Par contre Sequel me parait plus simple. Il a sûrement des fonctionnalités en moins et est moins rapide, mais ça devrait me suffire. Qu'en penses-tu ?
Je pense que tu trouvera plus de documentation et d'aide en utilisant directement la syntaxe SQL plutôt qu'un ORM moins populaire comme Sequel (qui l'utilise de toute façon derrière la scène).
Pour débuter il y a plusieurs ressources :
N'hésite pas à lire des tutoriels écrits pour d'autres langages ou systèmes de base de données : le langage SQL est identique partout à l'exception de quelques petits détails.