How can I access a variable defined in a Ruby file I required in IRB?

前端 未结 4 1618
囚心锁ツ
囚心锁ツ 2020-12-01 18:33

The file welcome.rb contains:

welcome_message = \"hi there\"

But in IRB, I can\'t access the variable I just created:

相关标签:
4条回答
  • 2020-12-01 19:01

    You can't access local variables defined in the included file. You can use ivars:

    # in welcome.rb
    @welcome_message = 'hi there!'
    
    # and then, in irb:
    require 'welcome'
    puts @welcome_message
    #=>hi there!
    
    0 讨论(0)
  • 2020-12-01 19:02

    While it is true that you cannot access local variables defined in required files, you can access constants, and you can access anything stored in an object that you have access to in both contexts. So, there are a few ways to share information, depending on your goals.

    The most common solution is probably to define a module and put your shared value in there. Since modules are constants, you'll be able to access it in the requiring context.

    # in welcome.rb
    module Messages
      WELCOME = "hi there"
    end
    
    # in irb
    puts Messages::WELCOME   # prints out "hi there"
    

    You could also put the value inside a class, to much the same effect. Alternatively, you could just define it as a constant in the file. Since the default context is an object of class Object, referred to as main, you could also define a method, instance variable, or class variable on main. All of these approaches end up being essentially different ways of making "global variables," more or less, and may not be optimal for most purposes. On the other hand, for small projects with very well defined scopes, they may be fine.

    # 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
    
    0 讨论(0)
  • 2020-12-01 19:06

    I think the best way is to define a class like this

    class Welcome
      MESSAGE = "hi there"
    end
    

    then in irb you can call your code like this :

    puts Welcome::MESSAGE
    
    0 讨论(0)
  • 2020-12-01 19:09

    That should at least enable the experience from irb:

    def welcome_message; "hi there" end
    
    0 讨论(0)
提交回复
热议问题