2011-11-23 32 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"] 
相關問題