2011-11-23 34 views
4

这里是什么,我试图做一个例子:有没有办法在Ruby中使用整数作为方法名?

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 

难怪它不是读取通道。帮帮我?

+1

我这样读了3次,仍然不确定你想要做什么。您不能将9定义为方法,请解释9与代码片段的关系。 – Gazler

+0

我正在尝试为SiriProxy制作DirecTV频道转换器。问题是,您必须将按钮逐个发送到接收器。在底部的代码片段中,它将信道分离并将数字发送到定义,然后运行该命令。 – williammck

回答

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的一个非常详细的方式。

+0

这会拆分所有的数字吗?如果channelNumber是1231,我需要它发送一个命令然后2然后3然后1. – williammck

+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.to_s检查nil?是一个空字符串,从而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"] 
相关问题