2013-09-24 20 views
6

让我们假设一个脚本需要访问一个目录,比如在“任意”操作系统上的/some/where/abc。有几个选项,以构建在Ruby中的路径:如何在Ruby中构建一个可移植的绝对路径?

  • File.join('', 'some', 'where', 'abc')
  • File.absolute_path("some#{File::SEPARATOR}where#{File::SEPARATOR}abc", File::SEPARATOR)
  • Pathname标准API

在我认为,第一个解决方案是不够清楚,但地道。根据我的经验,一些代码审查要求评论,说明它做什么...

问题

有没有更好的方式来建立一个绝对路径红宝石,其中更好的方法“做的工作,并为自己说话“?

+2

我只是在代码审查中链接文档。它明确指出“返回一个使用File :: SEPARATOR连接字符串形成的新字符串”。 'File#join'是生成便携式路径的常用方法。 –

+1

根据“任意操作系统”的含义,作为字符串文字的“tmp/abc /”是Linux,Mac和Windows上的有效路径。 –

+0

该文档或仅作为注释的预期路径,效果很好。试图在Ruby中发现隐藏或遗忘的法术。 –

回答

3

如果我正在进行代码审查,我会选择的是在Windows /tmp不一定是创建临时目录的最佳位置,并且最初的'',参数对于创建的临时审查可能并不明显<nothing>/tmp/abc。因此,我会推荐此代码:

File.join(Dir.tmpdir(), 'abc') 

请参阅Ruby-doc for an explanation

UPDATE

如果扩大问题一个更通用的解决方案,不使用tmpdir()涉及,我看不出一个解决方法使用初始''成语(劈?)。在Linux上,这可能不是太多问题,但是在具有多个驱动器号的Windows上它会是。此外,似乎没有用于迭代挂载点的Ruby API或gem。

因此,我的建议是授权安装点定义,可能是'/'适用于Linux,'z:/'用于Windows和smb://domain;[email protected]/mountpoint为Samba共享的配置选项,然后用File.join(ProjectConfig::MOUNT_POINT, 'some', 'where', 'abc')

+0

tmpdir上的好结果。这更便于携带,也更能反映意图。 +1 –

+0

感谢您的建议。非常适合解决我的特殊问题。我不会将问题标记为已回答。让我们看看是否有人对一般问题有一个好主意(现在意识到'/ tmp'以一种意想不到的方式提出问题)。 –

+1

@Eric我看到你重写了这个问题!我已经有了一个想法和一个环顾四周,我看不到什么让我最不舒服的通用解决方案,领先的''''。似乎没有通用的方法来迭代挂载点,例如获取Windows的'c:/'或Linux上的Samba挂载点等。也许将挂载点定义委派给一个配置选项是最好的折衷办法,并且使用' File.join(ProjectConfig :: MOUNT_POINT,'foo','bar')'? –

2

File#join是在Ruby中构建可移植路径的规范方法。我想知道谁在做这个评论。也许Ruby对你的组织来说是新的。

我同意@ChrisHeald提到文档是向评论者解释代码的最佳方式。

+0

谢谢。我同意所有的评论,所以+1。文件#加入是我的首选方法,但依赖于一个习惯用法。问题的关键在于“炫耀”解决这个问题的更好方法(如果有的话)---审查只是设置来说明会发生什么。 –

相关问题