以下是我正在尝试做的一个例子:
def 9()
run_playback_command(NINE_COMMAND)
end
我喜欢这样,因为它应该在以后像这样使用:
if(channelNumber != nil)
splitChannel = "#{channelNumber}".split(//)
if(splitChannel[3] != nil)
response = "#{splitChannel[3]}"()
end
if(splitChannel[2] != nil)
response = "#{splitChannel[2]}"()
end
if(splitChannel[1] != nil)
response = "#{splitChannel[1]}"()
end
if(splitChannel[0] != nil)
response = "#{splitChannel[0]}"()
end
end
对不起,如果这是一个简单的问题就麻烦了!我是Ruby的新手。
编辑:
这就是我想让Siri做的事情:
if(phrase.match(/(switch to |go to )channel (.+)\s (on )?(the )?(directv|direct tv)( dvr| receiver)?/i))
self.plugin_manager.block_rest_of_session_from_server
response = nil
if(phrase.match(/channel \s([0-9]+|zero|one|two|three|four|five|six|seven|eight|nine)/))
channelNumber = $1
if(channelNumber.to_i == 0)
channelNumber = map_siri_numbers_to_int(channelNumber)
end
channelNumber.to_s.each_char{ |c| run_playback_command(COMMAND[c]) }
end
难怪它不是在阅读频道。帮助
答案 0 :(得分:7)
这是你需要的吗?
COMMAND = {
"0" => ZERO_COMMAND,
"1" => ONE_COMMAND,
"2" => TWO_COMMAND,
#...
"9" => NINE_COMMAND
}
channelNumber.to_s.each_char{ |c| run_playback_command(COMMAND[c]) }
您甚至不需要检查nil?
,因为nil.to_s
是一个空字符串,因此each_char
迭代器不会处理任何字符。
顺便说一句,您不能使用标准语法定义(或调用)名称不是合法标识符(您不能以数字开头)的方法,但这在技术上是可行的:
class Foo
define_method "9" do
puts "It's nine!"
end
end
f = Foo.new
c = "9"
f.send(c)
#=> "It's nine!"
p (f.methods - Object.methods)
#=> [:"9"]
答案 1 :(得分:4)
在这里,有一个合适的解决方案:
callbacks = {"9" => lambda { run_playback_command(NINE_COMMAND) } }
if channelNumber
splitChannel = channelNumber.to_s.split(//)
splitChannel.each do |number|
callbacks[number].call
end
end
你的ifs集合只是一种非常冗长的写作方式splitChannel.each
。