web-dev-qa-db-fra.com

Comment partager des variables sur mes fichiers .rb?

J'ai quelques fichiers .rb Et je souhaite utiliser les mêmes variables dans toutes. Disons variable test_variable = "test" Doit être accessible à partir de tous mes fichiers .rb. Comment puis-je atteindre cela?

J'ai créé le fichier settings.rb Avec test_variable = "test" Puis utilisé require 'settings' Dans un autre fichier .rb, Mais cela n'a pas fonctionné. Je voudrais utiliser require non load.

J'ai essayé de rendre la variable globale en préfixant le nom de la variable avec $, Mais je reçois toujours undefined local variable or method 'test_variable' for main:Object (NameError).

31
Radek
  1. Les constantes (qui incluent des modules et des classes) sont ajoutées à l'environnement mondial partagé:

    phrogz$ cat constants1.rb 
    TEST_VARIABLE = "test"
    
    phrogz$ cat constants2.rb 
    require_relative 'constants1'
    p TEST_VARIABLE
    
    phrogz$ Ruby constants2.rb 
    "test"
    
  2. Les variables d'instance déclarées dans les principales font partie intégrante de la même chose main:

    phrogz$ cat instance1.rb 
    @test_variable = "test"
    
    phrogz$ cat instance2.rb 
    require_relative 'instance1'
    p @test_variable
    
    phrogz$ Ruby instance2.rb 
    "test"
    
  3. Les variables globales font également partie du même environnement (testé en 1.8.6, 1.8.7 et 1.9.2):

    phrogz$ cat global1.rb 
    $test_variable = "test"
    
    phrogz$ cat global2.rb 
    require_relative 'global1'
    p $test_variable, Ruby_DESCRIPTION
    
    phrogz$ Ruby global2.rb 
    "test"
    "Ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]"
    
44
Phrogz

Ruby Will jamais Partager des variables locales entre les fichiers. Vous pouvez les envelopper dans un module cependant:

module SharedVaribles
  @test_var="Hello, World"

  def self.test_var
    return @test_var
  end

  def self.test_var=(val)
    @test_val=val;
  end
end

Mettre cela dans settings.rb, require it dans tous vos fichiers et utiliser SharedVaribles.test_var et SharedVaribles.test_var= Pour accéder à la variable. N'oubliez pas que Ruby's require n'est rien comme C's #include, c'est beaucoup plus complexe. Il exécute le fichier, puis importe toutes les constantes, modules et classes au requireer.

15
Linuxios

Vous ne devriez pas avoir besoin d'envelopper ces variables dans un module.

Simplement les ajouter à another_file.rb et utiliser require_relative 'another_file' (si c'est dans le même répertoire) ou require 'path/to/another_file' devrait suffire à partager ces variables entre les fichiers.

0
Gerard Simpson