Domanda

Il file welcome.rb contiene:

welcome_message = "hi there"

Ma in IRB, non posso accedere alla variabile ho appena creato:

require './welcome.rb'

puts welcome_message 

# => undefined local variable or method `welcome_message' for main:Object

Qual è il modo migliore per portare a variabili predefinite e hanno fatto lavoro di inizializzazione quando si require qualcosa nella sessione IRB? Le variabili globali non sembrano la strada giusta.

È stato utile?

Soluzione

Se è vero che non si può accedere alle variabili locali definite nel file necessari, è possibile accedere a costanti, ed è possibile accedere a qualsiasi informazione archiviata in un oggetto che si ha accesso a in entrambi i contesti. Quindi, ci sono alcuni modi per condividere informazioni, a seconda dei vostri obiettivi.

La soluzione più comune è probabilmente di definire un modulo e mettere il valore condiviso in là. Dal momento che i moduli sono costanti, sarete in grado di accedervi nel contesto richiede.

# in welcome.rb
module Messages
  WELCOME = "hi there"
end

# in irb
puts Messages::WELCOME   # prints out "hi there"

Si potrebbe anche mettere il valore all'interno di una classe, per più o meno lo stesso effetto. In alternativa, si può solo definire come una costante nel file. Poiché il contesto predefinito è un oggetto della classe oggetto, indicato come principale, si potrebbe anche definire un metodo, variabile istanza o variabile classe principale. Tutti questi approcci finiscono per essere sostanzialmente diversi modi di fare "variabili globali," ottimali, più o meno, e non può essere per la maggior parte degli scopi. D'altra parte, per i piccoli progetti con scopi molto ben definiti, possono andare bene.

# in welcome.rb
WELCOME = "hi constant"
@welcome = "hi instance var"
@@welcome = "hi class var"
def welcome
  "hi method"
end


# in irb
# These all print out what you would expect.
puts WELCOME
puts @welcome
puts @@welcome
puts welcome

Altri suggerimenti

Non è possibile accedere a variabili locali definite nel file incluso. È possibile utilizzare Ivars:

# in welcome.rb
@welcome_message = 'hi there!'

# and then, in irb:
require 'welcome'
puts @welcome_message
#=>hi there!

Penso che il modo migliore è quello di definire una classe come questa

class Welcome
  MESSAGE = "hi there"
end

poi nella IRB è possibile chiamare il codice come questo:

puts Welcome::MESSAGE

Questo dovrebbe almeno consentire l'esperienza da IRB:

def welcome_message; "hi there" end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top