Ruby:在一组脚本中共享公共变量和方法

Cha*_*lie 2 ruby

我有一个充满ruby脚本的目录用于常见任务,我已经开始积累一组常见变量和方法,我发现自己在每个新脚本中定义.改进这一步骤的下一步似乎是创建一个文件(例如,commonstuff.rb)并从其他脚本中"需要"该文件,以便公共变量和方法在所有地方都可用并且只定义一次.

一个不起作用的简单尝试:

commonstuff.rb

username=ENV['USER']
home_dir_path=ENV['HOME']

def print_and_execute(command, &block)
  puts command

  process_io = IO.popen(command + "2>&1")

  while(line=process_io.gets)
    if (block != nil)
      yield line
    else
      puts line
      STDOUT.flush
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

script1.rb

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/common_stuff'

puts home_dir_path         # Fail
print_and_execute "date"   # Fail
Run Code Online (Sandbox Code Playgroud)

我已经使用了ruby库和框架,但我目前的环境中没有任何可用的.我只是直接的红宝石,我对一些在这里运作良好的基本习语有点生疏,或者看起来对红宝石专家来说是正确的.

任何帮助赞赏!

Sar*_*els 8

将您的方法和变量包装在一个模块中,例如

module CommonStuff
    USERNAME=ENV['USER']
    HOME_DIR_PATH=ENV['HOME']

    def print_and_execute(command, &block)
        ...
    end
end
Run Code Online (Sandbox Code Playgroud)

然后script1.rb可能是这样的:

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/commonstuff.rb'
include CommonStuff

puts HOME_DIR_PATH         # Win
print_and_execute "date"   # Win
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想在命名空间中包含该模块:

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/commonstuff.rb'

puts CommonStuff::HOME_DIR_PATH         # Win
CommonStuff.print_and_execute "date"   # Win
Run Code Online (Sandbox Code Playgroud)

另请参见模块模块上的Programming Ruby页面.