-2

如何使用单引号file使方法的参数sound成为 .fifo >extension 的文件名?我已经上下搜索,并尝试了许多不同的 > 方法,但我认为我需要对这个方法有一套新的看法。

def 声音(文件)@cli.stream_audio('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

4

2 回答 2

7

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

是否有理由需要使用单引号?

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

正如查尔斯考德威尔在他的评论中所说,让跨平台文件路径正常工作的最佳方法是使用File.join. 使用它,您的方法将如下所示:

def sound(FILE)
  @cli.stream_audio(File.join("audio", "#{FILE}.fifo"))
end
于 2013-07-17T14:24:39.157 回答
1

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

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

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

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

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

\t解释为一个选项卡。这是因为,就像 Ruby 如何#{}在双引号中插入代码一样,它也将解释\n\t转换为新行或新标签。所以当它看到"audio\file.fifo"它实际上是"audio"用 a\f和看到的"ile.fifo"。然后它确定这\f意味着“换页”并将其添加到您的字符串中。这是转义序列的列表。它适用于 C++,但它适用于大多数语言。

正如@sawa 指出的那样,如果您的转义序列不存在(例如\y),那么它只会删除\并留下“y”。

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

有三种可能的解决方案:

  1. 使用正斜杠:

    "audio/#{file}.fifo"
    

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

  2. 使用\\

    "audio\\#{file}.fifo"
    

    使用双重\\转义 the\并使其按您的意图被读取。

  3. 使用File.join

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

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

于 2013-07-17T15:18:14.423 回答