单引号字符串插值来访问linux中的文件

时间:2013-07-17 14:20:07

标签: ruby

  

如何使用单引号将方法file的参数sound变为.fifo>扩展名的文件名?我上下搜索过,尝试了很多不同的方法,但我想我需要一套新的眼睛。

     

def声音(文件)        @ cli.stream_audio( '音频\ file.fifo')      端

好吧所以我终于让它工作了,可能不是正确的方法,但这似乎可以解决问题。首先,可能有一些空白区域干扰了我的文件参数。然后我使用了我看到的由几个不同的人发布的File.join选项。

我真的使用了一些答案,这就是它的结果:

    def sound(file)
    file = file.strip
    file = File.join('audio/',"#{file}.fifo")
    @cli.stream_audio(file) if File.exist? file
    end

像魅力一样! :d

2 个答案:

答案 0 :(得分:7)

Ruby插值要求您使用双引号。

您是否需要使用单引号?

def sound(FILE)
  @cli.stream_audio("audio/#{FILE}.fifo")
end

正如Charles Caldwell在评论中所说,使跨平台文件路径正常工作的最佳方法是使用File.join。使用它,您的方法将如下所示:

def sound(FILE)
  @cli.stream_audio(File.join("audio", "#{FILE}.fifo"))
end

答案 1 :(得分:1)

您的问题在于使用文件路径分隔符。您正在使用\。虽然这可能看起来不是什么大问题,但它实际上是在Ruby字符串中使用时。

在单引号字符串中使用\时,没有任何反应。按原样评估:

puts 'Hello\tWorld' #=> Hello\tWorld

注意当我们使用双引号时会发生什么:

puts "Hello\tWorld" #=> "Hello    World"

\t被解释为标签。这是因为,就像Ruby会在双引号中插入#{}代码一样,它也会将\n\t解释为新的行或标签。因此,当它看到"audio\file.fifo"时,实际上会看到"audio" \f"ile.fifo"。然后它确定\f表示'换页'并将其添加到您的字符串中。 Here is a list转义序列。它适用于C ++,但适用于大多数语言。

正如@sawa指出的那样,如果您的转义序列不存在(例如\y),那么它将删除\并保留'y'。

"audio\yourfile.fifo" #=> audioyourfile.fifo

有三种可能的解决方案:

  1. 使用正斜杠:

    "audio/#{file}.fifo"
    

    正向斜杠在传递给系统时将被解释为文件路径分隔符。我在Windows上使用\完成大部分工作,但在我的代码中使用/非常好。

  2. 使用\\

    "audio\\#{file}.fifo"
    

    使用双\\转义\并使其按预期读取。

  3. 使用File.join

    File.join("audio", "#{file}.fifo")
    

    这将使用File::SEPARATOR常量中设置的文件分隔符输出参数。