如何在 Ruby 中使用全局变量

awo*_*ojo 3 ruby

我有一种情况,我在脚本顶部定义了一个变量,并希望在方法中引用它:

#############
# Variables #
#############
tmp_dir = '/path/to/tmp/dir'

###########
# Methods #
###########
def cache(page)
  begin
    %x[wget -q -O #{tmp_dir}/page #{page}]
  rescue => msg
    puts "error: #{msg}"
    exit
  end
 end

cache("http://somepage.com")
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

undefined local variable or method `tmp_dir' for main:Object
Run Code Online (Sandbox Code Playgroud)

我猜我需要创建tmp_dir一个全局变量?我讨厌使用全局变量。有没有 Ruby-ish 的方法来做到这一点?

Ril*_*ark 5

tmp_dir在类定义中被定义为变量,但在实例函数中,您正在寻找在类tmp_dir实例上定义的变量。这就是为什么tmp_dir在函数内部未定义。

您可以将其设为全局或将其设为类变量作为快速修复。我认为有一个更好的选择:将它包装在它自己的知道如何缓存的类中,然后在tmp_dir不使其成为全局或类变量的情况下进行初始化:

class Cacher
    def initialize(tmp_dir)
        @tmp_dir = tmp_dir
    end

    def cache(page)
        wget "#{@tmp_dir}/page"
    end
end

# in your main file:
cacher = Cacher.new('/path/to/tmp/dir') # here's your configuration line, but with no global!

# later

cacher.cache("index.html")
Run Code Online (Sandbox Code Playgroud)