如果我这样做:
require 'inifile'
# read an existing file
file = IniFile.load('~/.config')
data = file['profile'] # error here
puts data['region']
我在这里收到错误:
t.rb:6:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
如果我指定一个绝对路径,它就会消失:
file = IniFile.load('/User/demo1/.config')
但我不想硬编码位置。如何在Ruby中将~
解析为路径?
答案 0 :(得分:4)
Ruby有一种针对这种情况的方法。它是File::expand_path
。
将路径名转换为绝对路径名。除非给出dir_string,否则从进程的当前工作目录引用相对路径,在这种情况下,它将用作起始点。给定的路径名可以以“〜”开头,它扩展到进程所有者的主目录(必须正确设置环境变量HOME)。
“~user”
扩展到指定用户的home
目录。
require 'inifile'
# read an existing file
file = IniFile.load(File.expand_path('~/.config'))
答案 1 :(得分:2)
在命令行的路径中给出~
时,shell会将~
转换为用户的主目录。 Ruby不会这样做。
您可以使用以下内容替换~
:
'~/.config'.sub('~', ENV['HOME'])
=> "/Users/ttm/.config"
或仅将文件引用为:
File.join(ENV['HOME'], '.config')
=> "/Users/ttm/.config"
或:
File.realpath('.config', ENV['HOME'])
=> "/Users/ttm/.config"