如何使用单引号将方法
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
答案 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
有三种可能的解决方案:
使用正斜杠:
"audio/#{file}.fifo"
正向斜杠在传递给系统时将被解释为文件路径分隔符。我在Windows上使用\
完成大部分工作,但在我的代码中使用/
非常好。
使用\\
:
"audio\\#{file}.fifo"
使用双\\
转义\
并使其按预期读取。
使用File.join
:
File.join("audio", "#{file}.fifo")
这将使用File::SEPARATOR
常量中设置的文件分隔符输出参数。